微信支付流程及注意要点

来源:互联网 发布:江苏影视频道网络直播 编辑:程序博客网 时间:2024/05/01 21:40

公众号设置: 1. 设置JS接口安全域名和网页授权域名(可设为一致)

         2. 设置支付授权目录和测试授权目录以及测试白名单(支付目录域名要在安全域名下,支付目录要精确到具体支付网页所在目录!)

开发流程:

1. 统一下单

这块按照文档走基本没有什么模糊的地方,成功后得到prepay_id

2. 统一下单成功后接下来要生成两个签名(这两个签名和统一下单中生成的签名不一样

a. 用于前端wx.config中的签名jsapiSign。

     需要使用到jsapi_ticket , 要在后端和access_token一样缓存

  (获取jsapi_ticket:  https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi )

   生成签名函数:

     /**
     * 生成jsapi_ticket签名 前端wx.config中使用
     * @param jsapi_ticket
     * @param nonce_str
     * @param timestamp
     * @param url
     * @return
     * @throws Exception
     */
    public static String getJsapiTicketSign(String jsapi_ticket,String nonce_str,String timestamp,String url)throws Exception{        
    String sg = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "&timestamp=" + timestamp + "&url=" + url;
    Util.log(sg);
    MessageDigest crypt=MessageDigest.getInstance("SHA-1");
    crypt.reset();
    crypt.update(sg.getBytes("UTF-8"));
        Formatter formatter=new Formatter();  
        for(byte b:crypt.digest()){  
            formatter.format("%02x", b);  
        }  
        String result=formatter.toString();  
        formatter.close();  
        return result;
    }
 

  这里主要主意url一定要与前端location.href一致,(注意使用request.getRequestUrl() 不一定是对的,存在ajax传输过来的其他url)

b. 前端使用的chooseWXPay中微信支付签名wxPaySign

    生成参数有:appId、nonceStr、package、signType(MD5)、timeStamp(秒)和key(可不传、官方提供实例中的统一支付函数会在最后加上)。

    可使用步骤1中返回的字段appId、nonceStr 与wx.config一致即可。

    这里重点注意:package的值是"prepay_id="+prepay_id 这种形式,不能只传从1中返回的prepay_id.

       /**
     * 前端使用的chooseWXPay中微信支付签名
     * @param map
     * @return
     */
     public static String getWxPaySign(Map<String,Object> map){
        ArrayList<String> list = new ArrayList<String>();
        for(Map.Entry<String,Object> entry:map.entrySet()){
            if(entry.getValue()!=""){
                list.add(entry.getKey() + "=" + entry.getValue() + "&");
            }
        }
        int size = list.size();
        String [] arrayToSort = list.toArray(new String[size]);
        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < size; i ++) {
            sb.append(arrayToSort[i]);
        }
        String result = sb.toString();
        result += "key=" + WxpayConfigure.getKey();
        Util.log("getWxPaySign Before MD5:" + result);
        result = MD5.MD5Encode(result).toUpperCase();
        Util.log("getWxPaySign Result:" + result);
        return result;
    }

3. 在这些都完成后将各字段 appId、timeStamp、nonceStr、wxPaySign、jsapiSign、prepay_id传到前台

    首先前端要引用

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

  在需要的地方调用WxPayStart函数并赋予后端传送的参数即可

function WxPayStart(appId,timeStamp,nonceSTr,prepay_id,paySign,jsapiSign){
   wx.config({      debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。      appId: appId, // 必填,公众号的唯一标识      timestamp: timeStamp, // 必填,生成签名的时间戳      nonceStr: nonceSTr, // 必填,生成签名的随机串      signature: jsapiSign,// 必填,调用js签名,      jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,这里只写支付的   });   wx.chooseWXPay({      timestamp: timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符      nonceStr: nonceSTr, // 支付签名随机串,不长于 32       package: "prepay_id=" + prepay_id, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***      signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'      paySign: paySign, // 支付签名      success: function (res) {         // 支付成功后的回调函数         alert("success");      }   });

   

0 0
原创粉丝点击