主页传送门: 传送
小程序支付是由微信支付推出的一种便捷支付方式,通过扫码、公众号跳转或应用内支付完成付款。小程序支付适用于各类线上场景,为商家提供了高效的收款方式,也为消费者提供了更加便捷的支付体验。
随着移动互联网的发展,小程序支付逐渐成为了线上支付的重要方式之一。本文将介绍小程序支付的详细流程,帮助更好地接入小程序支付功能。
接入小程序支付的前置准备包括以下步骤:
在小程序中,用户需要先进行登录,才能进行支付操作。
小程序登录流程:
重点
code
openid
openid是用来唯一标识用户的一个字符串。在微信小程序中,每个用户的openid都是唯一的。通过openid,小程序可以获取用户的基本信息。
注意:同一个用户在不同的小程序中拥有不同的openid。因此,在开发小程序时,不能使用openid来进行用户的唯一性判断。
小程序调用wx.login()方法,获取code;
代码示例
wx.login({
success (res) {
if (res.code) {
//发起网络请求
wx.request({
url: 'https://example.com/onLogin',
data: {
code: res.code
}
})
} else {
console.log('登录失败!' + res.errMsg)
}
}
})
开发者服务器向微信服务器发送请求,获取openid和session_key,并将这些信息存储到数据库中;
代码示例
JSONObject json = new JSONObject();
//登录凭证不能为空
if (code == null || code.length() == 0) {
json.put("success", false);
json.put("content", "code 不能为空");
return json;
}
String grant_type = "authorization_code";
//小程序唯一标识 (在微信小程序管理后台获取)
String wxspAppid = "wx363ea76369509eb8";
//小程序的 app secret (在微信小程序管理后台获取)
String wxspSecret = "93d676ea594e077ac3520c15f110322e";
/** 1、向微信服务器 使用登录凭证 code 获取 session_key 和 openid */
//请求参数
String params = "appid=" + wxspAppid + "&secret=" + wxspSecret + "&js_code=" + code + "&grant_type=" + grant_type;
//发送请求
String sr = HttpRequest.sendGet("https://api.weixin.qq.com/sns/jscode2session", params);
//解析相应内容(转换成json对象)
JSONObject json1 = JSONObject.parseObject(sr);
//获取会话密钥(session_key)
String session_key = json1.get("session_key").toString();
//用户的唯一标识(openid)
String openid = (String) json1.get("openid");
官网图示如下:
在小程序中进行支付操作,需要完成以下几个步骤:
//支付请求参数
var payparam = {
'nonceStr': 'noncestr',
'package': 'prepay_id=' + prepay_id,
'timeStamp': timeStamp,
'paySign': paySign,
'signType': 'MD5'
};
wx.requestPayment({
'timeStamp': payparam.timeStamp,
'nonceStr': payparam.nonceStr,
'package': payparam.package,
'signType': payparam.signType,
'paySign': payparam.paySign,
'success': function (res) {
console.log(res);
//支付成功逻辑
},
'fail': function (res) {
console.log(res);
//支付失败逻辑
}
});
支付处理及支付回调部分逻辑:
部分支付处理
@Override
public JSONObject payment(JSONObject jsonObject, HttpServletRequest request) {
JSONObject json = new JSONObject();
WxPayUnifiedOrderV3Result.JsapiResult result = null;
String randomStr = "";
try {
// 后台支付逻辑省略
。。。。
String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
String notifyUrl = url + PayUtil.NotifyUrl;
System.out.println(‘ID’+ "微信回调地址" + notifyUrl);
}
} else {
throw new CommonException("不存在,id值为:{}", jsonObject.getString("Id"));
}
// 调用下单API
result = this.createOrderV3(‘ID’, ‘支付金额’,
jsonObject.getString("openId"));
} catch (Exception e) {
e.printStackTrace();
}
//直接返回给前端,前端调用即可
json.put("result", result);
json.put("randomStr", randomStr);
return json;
}
部分支付回调
public static String NotifyUrl="/tencent/payCallBack";
public static String sign(String text, String key, String input_charset) {
text = text + "&key=" + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}
public static boolean verify(String text, String sign, String key, String input_charset) {
text = text + key;
String mysign = DigestUtils.md5Hex(getContentBytes(text, input_charset));
if (mysign.equals(sign)) {
return true;
} else {
return false;
}
}
public static byte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) {
return content.getBytes();
}
try {
return content.getBytes(charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
}
}
引用官方小程序支付流程图:
步骤4:用户下单发起支付,商户可通过JSAPI下单创建支付订单。
步骤9:商户小程序内使用小程序调起支付API(wx.requestPayment)发起微信支付,详见小程序API文档
步骤16:用户支付成功后,商户可接收到微信支付支付结果通知支付通知API。
步骤21:商户在没有接收到微信支付结果通知的情况下需要主动调用查询订单API查询支付结果。
小程序支付功能需要满足以下几个要求:
常见的问题包括:
小程序支付流程的具体步骤是什么?
如何提高小程序支付系统的稳定性?
小程序支付过程中,如何保证支付的安全性?
小程序支付过程中,如何处理支付失败的情况?
如何根据微信服务器发送的支付结果通知,更新订单支付状态?
如果喜欢的话,欢迎 关注 点赞 评论 收藏 一起讨论 你的评价就是我✍️创作的动力!
参考文档:
微信小程序