微信小程序支付前后端Java版
时间: 2023-09-15 18:21:52 浏览: 116
微信小程序 PHP 带前后端
微信小程序支付需要前后端配合完成,前端主要是展示支付页面和获取用户的支付信息,后端则是处理微信的支付请求和返回支付结果。
以下是微信小程序支付的前后端Java版实现步骤:
前端:
1. 在支付页面中引入微信支付SDK,并初始化支付参数。
```javascript
var payData = {
timeStamp: '', // 时间戳
nonceStr: '', // 随机字符串
package: '', // 统一下单接口返回的 prepay_id 参数值,提交格式如:prepay_id=***
signType: 'MD5', // 签名算法,仅支持 MD5
paySign: '', // 签名
};
// 初始化支付参数
function initPayParams() {
// 获取订单信息
var orderInfo = getOrderInfo();
// 调用后端接口获取支付参数
wx.request({
url: 'https://example.com/pay',
method: 'POST',
data: {
orderInfo: orderInfo,
},
success: function(res) {
var data = res.data;
// 设置支付参数
payData.timeStamp = data.timeStamp;
payData.nonceStr = data.nonceStr;
payData.package = data.package;
payData.paySign = data.paySign;
},
});
}
```
2. 调用微信支付SDK完成支付。
```javascript
// 调用微信支付SDK
function pay() {
wx.requestPayment({
timeStamp: payData.timeStamp,
nonceStr: payData.nonceStr,
package: payData.package,
signType: payData.signType,
paySign: payData.paySign,
success: function(res) {
// 支付成功
console.log('支付成功');
},
fail: function(res) {
// 支付失败
console.log('支付失败');
},
});
}
```
后端:
1. 接收前端传来的订单信息。
```java
@RequestMapping(value = "/pay", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> pay(HttpServletRequest request) {
String orderInfo = request.getParameter("orderInfo");
// 处理订单信息
return result;
}
```
2. 调用微信支付统一下单API,生成预支付订单。
```java
// 生成预支付订单
public String createUnifiedOrder(String body, String outTradeNo, int totalFee, String spbillCreateIp, String notifyUrl) {
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
// 构建请求参数
Map<String, String> params = new HashMap<>();
params.put("appid", APP_ID); // 微信分配的公众账号ID
params.put("mch_id", MCH_ID); // 微信支付分配的商户号
params.put("nonce_str", getRandomString(32)); // 随机字符串
params.put("body", body); // 商品描述
params.put("out_trade_no", outTradeNo); // 商户订单号
params.put("total_fee", String.valueOf(totalFee)); // 订单总金额,单位为分
params.put("spbill_create_ip", spbillCreateIp); // 终端IP
params.put("notify_url", notifyUrl); // 通知地址
params.put("trade_type", "JSAPI"); // 交易类型
// 生成签名
String sign = getSign(params);
params.put("sign", sign);
// 发送请求
String xml = mapToXml(params);
String responseXml = HttpUtils.post(url, xml);
Map<String, String> resultMap = xmlToMap(responseXml);
// 获取返回结果
String prepayId = resultMap.get("prepay_id");
return prepayId;
}
```
3. 根据预支付订单生成支付参数,返回给前端。
```java
@RequestMapping(value = "/pay", method = RequestMethod.POST)
@ResponseBody
public Map<String, Object> pay(HttpServletRequest request) {
String orderInfo = request.getParameter("orderInfo");
// 处理订单信息
// 生成预支付订单
String prepayId = createUnifiedOrder(body, outTradeNo, totalFee, spbillCreateIp, notifyUrl);
// 生成支付参数
Map<String, String> payParams = new HashMap<>();
payParams.put("appId", APP_ID);
payParams.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
payParams.put("nonceStr", getRandomString(32));
payParams.put("package", "prepay_id=" + prepayId);
payParams.put("signType", "MD5");
String paySign = getSign(payParams);
payParams.put("paySign", paySign);
return payParams;
}
```
4. 处理微信支付结果,返回给前端。
```java
@RequestMapping(value = "/notify", method = RequestMethod.POST)
@ResponseBody
public String notify(HttpServletRequest request) {
String xml = HttpUtils.readData(request);
Map<String, String> resultMap = xmlToMap(xml);
// 验证签名
if (!verifySign(resultMap)) {
return "FAIL";
}
// 判断支付结果
if ("SUCCESS".equals(resultMap.get("result_code"))) {
// 更新订单状态
return "SUCCESS";
} else {
return "FAIL";
}
}
```
阅读全文