业务流程:用户点击发起支付按钮请求后端接口–>{后端:按API要求组装参数,以 XML 方式发送(POST)给微信支付接口(URL),微信支
付接口也是以 XML 方式给予响应}–>用户看到了一个输入密码的界面,包含金额等一些信息–>用户输入密码后出来一个支付成功的页面(这部分流程都是微信自己完成的,我们什么都不用做)–>返回系统自己的页面
开发流程
- 1)获取用户授权
- 2)调用统一下单接口获取预支付id
- 3)H5调起微信支付的内置JS
- 4)支付完成后,微信回调URL的处理
授权登录本文章不写,请查看授权登录文章:https://blog.csdn.net/I7show/article/details/80138424
前端JS调用后端支付接口
<%-- 微信支付JS --%>
<script type="text/javascript">
function submit() {
//支付金额
var totalPrice =$("#totalPrice").val();
$.ajax({
type:'POST',
url:'<%=basePath %>pay/saveFaceToFacePayment',
//data:{ totalPrice: totalPrice, url:urls ,orderId :orderId},
data:{ totalPrice: totalPrice,orderId :orderId ,content:"支付标题"},//传入后端接口的参数
async: false,
dataType: 'json',
success: function(data) {
//请求接口成功回调函数
if (data.code == 0) {
alert(data.data);
return;
}
if (data.status == "success") {
WeixinJSBridge.invoke( //调起微信支付的内置JS
'getBrandWCPayRequest', {
"appId": data.appId,//公众号名称,由商户传入
"timeStamp": data.timeStamp,//时间戳,自1970年以来的秒数
"nonceStr": data.nonceStr, //随机串
"package": data.package,
"signType": data.signType,//微信签名方式:
"paySign": data.paySign //微信签名
},
function (res) {
WeixinJSBridge.log(res.err_msg);
if (res.err_msg == "get_brand_wcpay_request:ok") {
location.reload();
} else if (res.err_msg == "get_brand_wcpay_request:cancel") {
alert("取消支付");
} else {
alert("支付失败");
}
}
);
} else {
alert('支付失败');
}
},
error: function(err){
//请求接口失败的回调函数
alert('网络异常');
}
});
}
</script>
后端接口
package net.seedor.controller.wechat;
import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.http.weixin.XmlResult;
import com.foxinmy.weixin4j.payment.WeixinPayProxy;
import com.foxinmy.weixin4j.payment.mch.Order;
import com.foxinmy.weixin4j.type.IdQuery;
import com.foxinmy.weixin4j.type.IdType;
import com.foxinmy.weixin4j.util.Consts;
import com.foxinmy.weixin4j.util.IOUtil;
import com.foxinmy.weixin4j.util.StringUtil;
import com.foxinmy.weixin<