这里是详细的微信开发的开发文档链接
function wechatDoPay({
//获取商品名称,价格,商品数量
$.ajax({
type:"post",
url:"http://www.xyz.cn/wechatTest/wechat/unifiedorder",
success:function(data){
if(data.status=="success"){
wx.chooseWXPay(data);
}
}
})
});
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});
备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。
@RequestMapping("unifiedorder")
@ResponseBody
public String unifiedorder(HttpServletRequest request, String goodsId, int countNum){
//在这里做一下校验,直接校验用户有没有登录,如果没有登录,就不允许吊起下单操作
//接受前台的token防止用户重复提交
String openid = "";//openid是微信用户在公众号appid下的唯一用户标识
JSONObject jsonObject = service.unifiedorder(openid, goodsId,countNum);
jsonObject.put("status", "success");
return jsonObject.toString();
}
public JSONObject unifiedorder(String openid, String goodsId, int countNum) {
GoodsOrder goodsOrder = new GoodsOrder();
//根据用户id查询用户权限,看看用户是否是VIP
//根据商品id查询出商品信息
//根据商品数量和商品价格,计算出要付的价格
//4、调用微信下单操作,开始执行微信下单功能
//获取预支付号
String out_trade_no = UUID.randomUUID().toString();//需要插入订单表的订单ID
String prepayId = "";//第一次生成的预支付订单
SortedMap
这是微信端需要的参数格式,都是以xml的形式传递
wx2421b1c4370ec43b
支付测试
JSAPI支付测试
10000100
1add1a30ac87aa2db72f57a2375d8fec
http://wxpay.wxutil.com/pub_v2/pay/notify.v2.php
oUpF8uMuAJO_M2pxb1Q9zNjWeS6o
1415659990
14.23.150.211
1
JSAPI
0CB01533B8C1EF103065174F50BCA001
这是第二次返回的xml结果,需要我们后台进行转换以及拼接成json字符串返回给前台
这是前台需要的参数类型,后台需要拼接成这种类似的格式,前台才能引用
wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: ‘’, // 支付签名随机串,不长于 32 位
package: ‘’, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: ‘’, // 签名方式,默认为’SHA1’,使用新版支付需传入’MD5’
paySign: ‘’, // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});
@RequestMapping("wechatNotifyUrl")
@ResponseBody
public String wechatNotifyUrl(HttpServletRequest request){
try {
//用户发送了一条消息或关注了我的公众号,都会发一条消息,消息是流形式
InputStream inStream = request.getInputStream();
//把消息流转换成文本类型
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
String result = new String(outSteam.toByteArray(), "UTF-8");
System.out.println("result==="+result);
//SAX解析xml
Map map = null;
//通过sax解析xml技术,把xml文本解析成map对象
try {
map = XMLUtil.doXMLParse(result);
} catch (JDOMException e) {
e.printStackTrace();
}
//必须要给微信一个回复,否则微信端会一直请求你的接口
return " ";
}catch (Exception e){
}
return null;
}
这里需要注意的是,一定要给微信端返回
“
”;
这种形式的数据,不然微信端会一直调用你的后台接口确认你有没有接受到数据
前台调用后台接口→后台调用微信统一下单接口,后台返回调用微信统一下单后返回的内容给前台→前台根据后台返回的内容调用微信浏览器内置JS弹出支付→支付后有两种处理 ①前台支付成功后的页面 ②微信回调url(一般处理业务逻辑)
什么是支付的幂等性?
(1)用户多次请求造成出现多个订单
(2)支付完成后,被拦截或网络不好,造成收不到回调通知或是收到了回调通知,但是这个回调通知的金额和支付信息不匹配,说明数据有问题
可以参考以下博客来进行问题的解决
https://blog.csdn.net/github_36032947/article/details/78386551
https://www.cnblogs.com/leechenxiang/p/6626629.html
https://blog.csdn.net/aly1989/article/details/52352726