本文为学习记录weixin-java-tools实现公众号微信支付.
码云地址:
// 授权登录用到 <dependency> <groupid>com.github.binarywang</groupid> <artifactid>weixin-java-mp</artifactid> <version>3.1.0</version> </dependency>
// 微信支付用到 <dependency> <groupid>com.github.binarywang</groupid> <artifactid>weixin-java-pay</artifactid> <version>3.1.0</version> </dependency>
授权登录官方 api:
个人理解的授权登录流程:引导用户点击唤起授权登录的地址,打开页面后携带微信返回的code参数;使用code参数获取accesstoken;获取用户数据。
引导客户打开授权登录地址后,携带code跳转到指定页面在指定页面调用方法:
public result getaccesstoken(@requestparam(name = "code") string code, httpservletrequest request, httpservletresponse response) { if (stringutils.isblank(code)) { return result.error("code不存在"); } try { wxmpoauth2accesstoken wxmpoauth2accesstoken = wxmpservice.oauth2getaccesstoken(code); string accesstoken = wxmpoauth2accesstoken.getaccesstoken(); // 获取用户微信账户信息 wxmpuser wxmpuser = wxmpservice.getuserservice().userinfo(wxmpoauth2accesstoken.getopenid()); if (stringutils.isblank(wxmpuser.getopenid())) { return result.error("用户数据不存在"); } return result.success(wxmpuser); } catch (wxerrorexception e) { e.printstacktrace(); log.info("授权异常:{}", e); return result.error("授权登录失败"); } catch (exception e) { e.printstacktrace(); return result.error("登录失败"); } }
前端保存下用户信息就完事了。
个人理解的微信支付流程:用户页面点击<微信支付>按钮 后端调用 <微信统一下单> 统一下单返回参数 ,前端使用 <统一下单>返回的参数唤起微信支付。
商户中需要在api安全中设置很多东西... 就不一一赘述了
微信支付官方api 前端:
后端api
商户登录地址
public result pay(long orderno, httpservletrequest request) { //查询订单信息 order order = orderservice.findbyorderno(orderno); try { wxpayunifiedorderrequest orderrequest = new wxpayunifiedorderrequest(); //获取当前用户 userinfo userinfo = requestcontextholderutil.getuserinfo(); orderrequest.setbody("支付内容的说明"); //商户号 orderrequest.setmchid(mchid); orderrequest.setattach("xxx公司"); orderrequest.setouttradeno(orderno.tostring()); orderrequest.settotalfee(basewxpayrequest.yuantofen(order.getpayment().tostring()));//元转成分 orderrequest.setopenid(userinfo.getopenid()); orderrequest.setspbillcreateip(httputils.getip(request)); //我这里是微信公众号内打开的h5页面 type使用 jsapi 根据业务场景变更 orderrequest.settradetype(wxpayconstants.tradetype.jsapi); // 支付成功后跳转页面 这里需要对url进行编码 orderrequest.setnotifyurl("http://xxxxxxxxx"); orderrequest.setappid(appid); // 调用sdk提供的统一下单方法 createorder会返回重新组装后的对象 建议使用这个 object unorder = wxservice.createorder(orderrequest); // 这个可能是偏向原生一点的统一下单,返回的参数有很多没用的 或者null值 建议使用 createorder下单 // wxservice.unifiedorder(orderrequest); return result.success(unorder); } catch (exception e) { log.error("微信支付失败!订单号:{},原因:{}", orderno, e.getmessage()); e.printstacktrace(); return result.error("支付失败,请稍后重试!"); } }
前端js代码:
前端唤起微信支付的时候可能会出一些问题,这里建议使用 console.log(res.err_desc);输出错误信息
res.err_msg 只会提示支付失败... desc会提示一些具体信息
function onbridgeready(){ weixinjsbridge.invoke( 'getbrandwcpayrequest', { "appid":"wx31fd1e1bad23db37", //公众号名称,由商户传入 "timestamp":wxdata.timestamp, //时间戳,自1970年以来的秒数 "noncestr":wxdata.noncestr, //随机串 "package":wxdata.packagevalue, "signtype":wxdata.signtype, //微信签名方式: "paysign":wxdata.paysign //微信签名 }, function(res){ console.log(res.err_desc) if(res.err_msg == "get_brand_wcpay_request:ok" ){ // 使用以上方式判断前端返回,微信团队郑重提示: //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 } }); } var wxdata={}; function pay(orderid){ $.ajax({ url:"统一下单方法url", type:'get', data:{orderno:orderid}, beforesend: function (xhr) { xhr.setrequestheader("token", $.cookie("token")); }, crossdomain: true, success:function(result){ wxdata=result.data; if (typeof weixinjsbridge == "undefined") { if (document.addeventlistener) { document.addeventlistener('weixinjsbridgeready', onbridgeready, false); } else if (document.attachevent) { document.attachevent('weixinjsbridgeready', onbridgeready); document.attachevent('onweixinjsbridgeready', onbridgeready); } } else { onbridgeready(); } } }); }
注:商户中心支付路径设置 所有调起微信支付的页面都要在此注册,否则微信支付会一闪而过。
微信开发工具上可以模拟授权登录,但是无法模拟微信支付,所以微信支付在微信开发工具上出现的错误都不用管,直接拿到真机上去测试!
使用了sdk后的支付和授权还是很方便的,麻烦的是微信方面的一些配置和流程... 很坑。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
asp.net中ajax和一般处理程序(handler.ashx)的交互
egg.js创建项目,目录介绍,简单使用,sequelize mysql使用
网友评论