微信公众号支付
微信公众号支付:
一.获取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 + "¬ify_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;
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 }
参数:
appId:
timeStamp:时间戳
nonceStr:随机串
package:prepay_id='第二步预支付返回的预支付订单id'
signType:密钥(MD5)
paySign:加密签名(签名规则同上)
支付已完成,后续查询订单、关闭订单、退款等,查看相关文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
浙公网安备 33010602011771号