思路:
第一次做H5支付,在网上看到了很多文章,大多说怎么调用openId什么的。
其实H5支付不需要获取openId,而是根据用户的ip地址作为识别。
大体思路如下:
前端采用vue:
生成订单:
// 生成订单
submitOrder: function () {
let param = {userId: this.userId }
this.$http
.post('/api/xxxx', param, { emulateJSON: true })
.then(res => {
headerId = []
var arr = []
if (res.data.success == true) {
for (var i = 0; i < res.data.orders.length; i++) {
arr.push(res.data.orders[i].id)
}
headerId = arr//这里保存订单id
this.pay()//这里调用支付
} else {
Indicator.open({
text: '网络出错...',
spinnerType: 'fading-circle'
})
}
})
},
支付--调用统一订单
pay: function () {
var arr = headerId.join(',')
let param = {
total_fee: this.total,
attach: 'H5支付',
openId: '',
body: 'H5支付',
userId: this.userId,
requestNum: '',
payWays: this.payWay,//支付方式:11 微信 10 支付宝
headerIds: arr}
this.$http
.post('/api/xxxx', param, {emulateJSON: true})
.then(res => {
// eslint-disable-next-line eqeqeq
if (this.payWay == '11') {
window.location.href = res.body.data.payUrl + '&redirect_url=http%3a%2f%2fxxx.com' //这里的redirect_url 需要进行urlencode处理
} else {
var bhtml = res.body.data.payUrl
document.getElementById('alipay').innerHTML = bhtml
document.forms[0].submit()
}
})
},
调用统一订单接口:
@Override
public String orderPay(String outTradeNo) {
List
其他工具类可以参考小程序支付的文章:
https://blog.csdn.net/qq_30641447/article/details/73222648
H5支付所遇到的坑:
第一:ip地址,本地公网ip,本地用request获取的都是127.0.0.1,所以在测试的时候最好先写死公网ip
第二:域名配置,需要在公众号配置而且前端(前后端分离的)的映射访问域名要一致,不然微信会检测referer与配置的域名是否一致
第三:微信、支付宝支付成功跳转到本系统页面(回调页面)配置:
微信
需要在MWEB_URL后拼接上redirect_url参数: 就是在返回的payUrl上拼接redirect_url(redirect_url进行urlencode处理)
支付宝
支付宝需要在支付宝回调的时候 在后端重定向到对应页面
由于返回后 前端的数据可能会丢失,所以第一可以一开始可以把前端的数据保存到本地缓存,第二在跳转的时候传参,返回页面的时候再获取
常见问题:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4