完成以上两步后,微信端的支付端口就能够被我们的网站调用了。
三、分析业务时序图
微信在官方文档中用时序图反映了其对应的业务流程。
根据此图,可以看出流程大致为:自己的java后台生成付款链接,用户点击链接,在java后台中生成商户订单,将此订单按照微信的格式发送给微信支付系统,微信支付系统生成一个预付单给java后台,然后在java后台中生成支付参数返回给用户,用户点击付款,会向微信支付系统检查支付参数的合法性,确认无误后即可完成付款操作。付款完成后异步通知商户付款结果,并会跳到指定的付款成功页面。
四、java实现
1、首先需要调用微信支付的包,加入到pom.xml中。
2、在页面中,需要点击支付按钮发生的事件如下,首先跳转到自己的后台,返回支付所需要的支付参数,并存进js的元素中,留给pay2()使用。其中'${redirect_uri}'这个值是自己之前填进去的域名。只不过这里我为了方便管理,讲其写入了配置文件,可以让其作为后台返回的一个值传进js中。
3、通过"mobile/user/pay/"这个地址对应的java处理Controller如下代码所示,目的是返回支付所需要的参数值。其中openId这一参数是在用户使用微信登录时被我存入session中的。重点在于WXPayExample.yy(openId)这里,这个类是通过openId获取预付款信息的通道。
Controller.java
在WXPayExample类中,第一步还是通过MyConfig()配置获取服务号APPID,商户号,和Key,并且加载支付证书。然后填写支付信息中的随机码,支付金额,付款方式,付款URL等。然后由WXPay将其添加签名,WxPayUtil将其转化为xml文件,通过wxpay.unifiedOrder(data)发送给微信支付平台,并获取返回值。其中这个三个包都可以需要导入
WXPayExample.java
MyConfig.java
4,这个时候,就已经可以拿到预付款信息了。里面有一个预付款prepay_id就是微信平台中的该条预付款信息的ID。将返回的nonceStr,prepay_id按照要求封装为package与其他的参数打包在一起。并添加一个签名。然后把签名和其他所有的标签放进map集合后,转成result1发送给页面。用户既可以选择支付了。
5、用户支付的java。回到cart.jsp中,第二步中的ajax获取到返回值之后,就可以进行下一步操作了。pay2()这一个function是用户支付指令的发送,当微信支付准备好了之后,通过onBridgeReady()这一方法进行付款,如果付款成功,调用success方法,失败后直接跳转到失败页面。至此,这个整个过程就宣告结束。
cart.jsp