微信公众号支付

微信公众号支付:

一.获取openId

  1.get请求获取授权码:code

    url:https://open.weixin.qq.com/connect/oauth2/authorize

    参数:appid:

       redirect_uri:回调url(需要在公众号里配置)

       response_type:code(不变)

       scope:snsapi_base(这个值微信不会弹出页面,让用户同意授权)还有其他值,具体参看微信文档

       state:可选参数(一般情况下,会传一些授权完需要回传的参数值,传过去什么,微信会回传什么)

   2.第一步授权完之后,会返回code和state,然后获取access_token、openid

     url:https://api.weixin.qq.com/sns/oauth2/access_token

     参数:code:第一步获取之后回调到本系统,获取授权码code

          String code = request.getParameter("code");

           String state = request.getParameter("state");

        appid:

        secret:

        grant_type:authorization_code(固定值)

二.创建微信预支付订单 微信预支付订单文档

  url:https://api.mch.weixin.qq.com/pay/unifiedorder

  请求参数:xml格式

<xml>
   <appid>wx2421b1c4370ec43b</appid>
   <attach>支付测试</attach>
   <body>JSAPI支付测试</body>
   <mch_id>10000100</mch_id>
   <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str>
   <notify_url>http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php</notify_url>
   <openid>oUpF8uMuAJO_M2pxb1Q9zNjWeS6o</openid>
   <out_trade_no>1415659990</out_trade_no>
   <spbill_create_ip>14.23.150.211</spbill_create_ip>
   <total_fee>1</total_fee>
   <trade_type>JSAPI</trade_type>
   <sign>0CB01533B8C1EF103065174F50BCA001</sign>
</xml>

   注意事项:

     加密:

      1.把所有参数,按字母排序

1 String prepayStr = "appid=" + app_id + "&body=" + body + "&mch_id=" + partner + "&nonce_str=" + noncestr
2 + "&notify_url=" + notify_url + "&" + "openid=" + openId + "&out_trade_no=" + flownumber
3 + "&spbill_create_ip="+spbill_create_ip+"&total_fee=" + total_fee + "&trade_type=JSAPI&key=" + partner_key;
View Code

      2.然后MD5加密

      3.加密后把所有的都转化为大写

    notify_url:接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。

 三.调用支付(需要在微信里边才可以发起js调用)https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

 1                 if(window.WeixinJSBridge) {
 2                     window.WeixinJSBridge.invoke('getBrandWCPayRequest',{
 3                         "appId" : appId, //公众号名称,由商户传入
 4                         "timeStamp" : timeStamp, //时间戳
 5                         "nonceStr" : nonceStr, //随机串
 6                         "package" : wxpackage,//扩展包
 7                         "signType" : "MD5", //微信签名方式:1.sha1
 8                         "paySign" : paySign //微信签名
 9                     },function(res){
10                         //alert(res.err_code+" err_desc="+res.err_desc+" err_msg="+res.err_msg);
11                         
12                         if(res.err_msg == "get_brand_wcpay_request:ok" ) {
13                             alert("支付成功喽!");
14                             //document.location = "http://192.168.34.116/mpay/success";
15                             document.location = "http://mpay.hc360.com/mpay/success";
16                             //document.location = "http://wechat.mob.hc360.com/mptrade/wechat/success?orderid="+orderid+"&flownumber="+orderids;
17                         }else {
18                             alert("支付失败!请重新尝试!");
19                             //alert(res.err_code+" err_desc="+res.err_desc+" err_msg="+res.err_msg);
20                             // document.location = "http://wechat.mob.hc360.com/mptrade/wechat/Failure?orderid="+orderid+"&flownumber="+orderids;
21                         }
22                                     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
23                                     //因此微信团队建议,当收到ok返回时,向商户后台询问是否收到交易成功的通知,若收到通知,前端展示交易成功的界面;若此时未收到通知,商户后台主动调用查询订单接口,查询订单的当前状态,并反馈给前端展示相应的界面。
24                     });
25                 }else{
26                     alert("请在微信内打开!");
27                 }
View Code

  参数:

    appId:

    timeStamp:时间戳

    nonceStr:随机串

    package:prepay_id='第二步预支付返回的预支付订单id'

    signType:密钥(MD5)

    paySign:加密签名(签名规则同上)

 

支付已完成,后续查询订单、关闭订单、退款等,查看相关文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

 

posted @ 2016-01-21 17:17  刘尊礼  阅读(308)  评论(0)    收藏  举报