微信小程序第四天(微信小程序支付)_MrXu_的博客-程序员宅基地

技术标签: 微信小程序  支付  微信  小程序  

微信小程序支付的前置准备:
1.微信商户平台账号
2.微信小程序账号
3.微信小程序开通支付接口(个人暂时不支持开通支付)

前台需要的操作:
1.登录获取code,传给后台
2.获取后台传过来的值调用wx.requestPayment方法
后台需要的操作:
1.通过前台传过来的code来获取用户的openId
2.生成sign
3.获取perpay_id
4.再生成一次前台需要的paySign

具体操作:
登录获取code:

wx.login({
        success: function(res){
    
          // success
          console.log('这里有code',res)
        },
        fail: function(res) {
    
          // fail
        },
        complete: function(res) {
    
          // complete
        }
      })

传到后台:

wx.request({
        url: 'https://URL',//后台URL
        data: {},//登录获取的code
        method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
        // header: {}, // 设置请求的 header//后台规定的请求头
        //调用了之后无操作一下三个方法可以不写
        success: function(res){
          // success
        },
        fail: function(res) {
          // fail
        },
        complete: function(res) {
          // complete
        }
      })

后台通过过code获取oppenid只需要访问这个链接:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=前台传过来的CODE&grant_type=authorization_code

生成sign和得到perpay_id(此处后台用JAVA由于后台代码太多,我就放在最后面,有需要的可以自己进行查看)

其中获取perpay_id生成的sign需要的参数是我遇到的一个坑,请一定要注意你往微信传的值都是sign需要的value,其中openId在参数里面写的是否,但是微信小程序支付用到的trade_type是JSAPI,所以微信小程序的openId也是必须的参数。
当这些都准备好了之后你就可以获取perpay_id

接口链接
URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder

这个链接必须是xml格式的,前台是没法调用的。

有了perpay_id之后,在获取paySign(前台需要的)。这里不一定需要后台生成,前台也有相关的代码来生成。他需要的参数:
appId,nonceStr,package,signType,timeStamp,key
这是我遇到的坑二,因为你获取到了perpay_id时他会给你返回一个sign我之前以为是这个。

得到sign的代码:

/**  
    * 微信支付签名算法sign  
    * @param characterEncoding  
    * @param parameters  
    * @return  
    */    
   @Test   
   public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){    
       StringBuffer sb = new StringBuffer();    
       Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)    
       Iterator it = es.iterator();    
       while(it.hasNext()) {    
           Map.Entry entry = (Map.Entry)it.next();    
           String k = (String)entry.getKey();    
           Object v = entry.getValue();    
           if(null != v && !"".equals(v)     
                   && !"sign".equals(k) && !"key".equals(k)) {    
               sb.append(k + "=" + v + "&");    
           }    
       }    

       sb.append("key=" + WeChatPayUtils.key);    
       System.out.println("字符串:"+sb.toString());  
       String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();    
       return sign;    
   }    

MD5Util工具类代码如下:

package cn.cqzdkj.utils;  

import java.security.MessageDigest;  

public class MD5Util {
      
    private static String byteArrayToHexString(byte b[]) {  
        StringBuffer resultSb = new StringBuffer();  
        for (int i = 0; i < b.length; i++)  
            resultSb.append(byteToHexString(b[i]));  

        return resultSb.toString();  
    }  

    private static String byteToHexString(byte b) {  
        int n = b;  
        if (n < 0)  
            n += 256;  
        int d1 = n / 16;  
        int d2 = n % 16;  
        return hexDigits[d1] + hexDigits[d2];  
    }  

    public static String MD5Encode(String origin, String charsetname) {  
        String resultString = null;  
        try {  
            resultString = new String(origin);  
            MessageDigest md = MessageDigest.getInstance("MD5");  
            if (charsetname == null || "".equals(charsetname))  
                resultString = byteArrayToHexString(md.digest(resultString  
                        .getBytes()));  
            else  
                resultString = byteArrayToHexString(md.digest(resultString  
                        .getBytes(charsetname)));  
        } catch (Exception exception) {  
        }  
        return resultString;  
    }  

    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",  
        "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };  
}  

然后在需要的地方直接调用上面的ctreasign这个方法就行了。

SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();    
      parameters.put("appid", appid);    
      parameters.put("mch_id", mch_id);  
      parameters.put("nonce_str",nonce_str);   
      parameters.put("body", body);   
      parameters.put("out_trade_no", "20170215");  
      parameters.put("total_fee", 1);  
      parameters.put("spbill_create_ip", "x.x.x.x");  
      parameters.put("notify_url","http://xxxxx.com");  
      parameters.put("trade_type", "JSAPI");  
      parameters.put("openid", "oGY_ZvxxxxxM");  
      parameters.put("sign","");  


      String characterEncoding = "UTF-8";    
      String mySign = createSign(characterEncoding,parameters);    
      System.out.println("我 的签名是:"+mySign);   

干活系列项目地址:
码云:https://gitee.com/mrxu314/xcx_gh
gitHub:https://github.com/mrxu0/xcx_gh
希望这篇文章能够帮助到你们
欢迎大家关注我的公众号吵吵日记:
这里写图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37479946/article/details/70230869

智能推荐

PyTorch 1.0 中文文档:torch.onnx_verbose torch onnx_绝不原创的飞龙的博客-程序员宅基地

译者:guobaoyo示例:从Pytorch到Caffe2的端对端AlexNet模型这里是一个简单的脚本程序,它将一个在 torchvision 中已经定义的预训练 AlexNet 模型导出到 ONNX 格式. 它会运行一次,然后把模型保存至 alexnet.onnx:import torchimport torchvisiondummy_input = torch.randn(1...

30个珍藏的程序员超实用自学网站,干货!_程序自学网站_若年封尘的博客-程序员宅基地

有朋友问我平时都是在哪里自学的呢?大学四年以来我收藏了各种学习网站今天一次性分享给大家,一起学习!一、视频类自学网站1.哔哩哔哩自学观看各种教程视频,比较推荐B站,各个领域极其全面。网址:https://www.bilibili.com/2.慕课网这个网站也是比较常用的,有各种实用的教程,如果你想快速入门一种语言的话,可以到这看看。网址:https://www.imooc.com...

在使用计算机时可以用什么键关机,计算机快捷键怎么用(按什么),关机、睡眠等?..._WeQuant-Jason的博客-程序员宅基地

满意答案uahyiw2020.02.11采纳率:51%等级:11已帮助:6110人一.关机、睡眠的快捷键:1.先按左下角“windows“键,再按字母“U“键,再按字母“U”或“S”键。2.在桌面状态下按 ALT+F4 再按“U”键或者“S”键。二.windows快捷键1.单独按Windows:显示或隐藏“开始”功能表。2.Windows+BREAK:显示“系统属性”对话框。3.windo...

增强for循环用法_增强for循环获取下标_zolalad的博客-程序员宅基地

增强for循环用法1.首先增强for循环和iterator遍历的效果是一样的,也就说增强for循环的内部也就是调用iteratoer实现的,但是增强for循环有些缺点,例如不能在增强循环里动态的删除集合内容。不能获取下标等。2.ArrayList由于使用数组实现,因此下标明确,最好使用普通循环。3.而对于LinkedList 由于获取一个元素,要从头开始向后找,因此建议使用增强

ubuntu 18.04检测到系统出现问题_ubuntu报系统出现问题是否需要反馈_老歌且摇滚的博客-程序员宅基地

sudo gedit /etc/default/apport //进行apport设置更改enabled = 0 ,就再也不会弹出了。为什么会出现该弹框:原因是Ubuntu系统是有bug的因此需要用户的反馈,但是用户反馈了开发者也不一定看到。就是说当我们永久关闭弹框之后,对ubuntu系统的改善是有一定影响的。但是影响不大。...

随便推点

怎样在Vue中使用websocket传输数据_vue发送websocket_南北极之间的博客-程序员宅基地

简介WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。其他特点包括:(1)建立在 TCP 协议之上,服务器端的实现比较容易。(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。(3)数据格式比较轻量,性能开销

Docker镜像与仓库_qq827887的博客-程序员宅基地

Docker镜像容器的基石层叠的只读文件系统联合加载(union mount)docker镜像文件目录/var/lib/docker/aufs/mnt镜像的基本操作列出镜像shell:docker images [OPTSIONS][REPOSITORY] -a --all = false 显示所有镜像 -f --filter = [] 显示时的过滤条件

泰勒展开式_段星星的博客-程序员宅基地

泰勒展开式一元函数Taylor展开f(x)=f(x0)+f,(x0)(x−x0)+f,,(x)2(x−x0)2+...+fn(x)n(x−x0)n+Rf( x) =f( x_{0}) +f^{,}( x_{0})( x-x_{0}) +\frac{f^{,,}( x)}{2}( x-x_{0})^{2} +...+\frac{f^{n}( x)}{n}( x-x_{0})^{n}+R二元函数Ta

chinese-ocr自然场景下不定长文字识别(ctpn + densenet)_chinese ocr_这辈子就是你的博客-程序员宅基地

#chinese-ocr自然场景下不定长文字识别(ctpn + densenet)注:本文中多处使用各位前辈的经验,项目代码不方便提供,可百度下载参考##实现功能文字方向检测 0、90、180、270度检测文字检测 后期将切换到keras版本文本检测 实现keras端到端的文本检测及识别不定长OCR识别##环境部署GPU环境sh setup.shCPU环境sh setup-cp...

python使用冒泡排序对list列表进行排序_Python利用sorted进行字典排序_weixin_39758229的博客-程序员宅基地

一、排序算法排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个dict呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。Python内置的sorted()函数就可以对list进行排序:>>> sorted([36, 5, -12, 9, -21])[-21, -12, 5, 9...

可视化库Seaborn基本操作1/2_18790970257的博客-程序员宅基地

python-3.7 pycharm serborn-0.9.0""" 可视化库Seaborn 时间:2018\9\13 0013 分析图绘制,Seaborn封装自Matplotlib"""import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom...

推荐文章

热门文章

相关标签