跳到主要内容

微信支付

简介

微信支付是腾讯旗下的第三方支付平台,为用户提供安全、快捷的支付服务。支持多种支付方式,包括扫码支付、公众号支付、小程序支付、APP支付等。本文档主要介绍JSAPI支付(公众号支付)的接入流程和代码实现。

JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。适用于在微信客户端内的网页应用。

参考资料

支付流程

关键代码实现

前端调用(JavaScript)

// 1. 引入微信JSSDK
// 方式一:通过CDN引入
// <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>

// 方式二:通过npm安装
// npm install weixin-js-sdk
// import wx from 'weixin-js-sdk'

// 2. 配置微信JSSDK
wx.config({
debug: false, // 开启调试模式
appId: 'your_app_id', // 必填,公众号的唯一标识
timestamp: '', // 必填,生成签名的时间戳
nonceStr: '', // 必填,生成签名的随机串
signature: '', // 必填,签名
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表
});

// 3. 发起支付请求
async function createWxPayOrder(orderData) {
const response = await fetch('/api/wxpay/create-order', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(orderData)
});

const payParams = await response.json();

// 调用微信JSAPI
wx.chooseWXPay({
timestamp: payParams.timeStamp,
nonceStr: payParams.nonceStr,
package: payParams.package,
signType: 'RSA',
paySign: payParams.paySign,
success: function(res) {
console.log('支付成功', res);
// 跳转成功页面或轮询订单状态
},
fail: function(res) {
console.log('支付失败', res);
}
});
}

后端实现

// 使用微信官方SDK
import com.wechat.pay.java.core.Config;
import com.wechat.pay.java.core.RSAAutoCertificateConfig;
import com.wechat.pay.java.service.payments.jsapi.JsapiServiceExtension;
import com.wechat.pay.java.service.payments.jsapi.model.*;

public class WxPayService {
private Config config;
private JsapiServiceExtension service;

public WxPayService(WxPayConfig wxConfig) {
this.config = new RSAAutoCertificateConfig.Builder()
.merchantId(wxConfig.getMchId())
.privateKeyFromPath(wxConfig.getPrivateKeyPath())
.merchantSerialNumber(wxConfig.getSerialNo())
.apiV3Key(wxConfig.getApiv3PrivateKey())
.build();
this.service = new JsapiServiceExtension.Builder().config(config).build();
}

// 统一下单
public PrepayWithRequestPaymentResponse createOrder(OrderData orderData) {
PrepayRequest request = new PrepayRequest();
request.setAppid(orderData.getAppId());
request.setMchid(orderData.getMchId());
request.setDescription(orderData.getDescription());
request.setOutTradeNo(orderData.getOutTradeNo());
request.setNotifyUrl(orderData.getNotifyUrl());

Amount amount = new Amount();
amount.setTotal(orderData.getAmount());
amount.setCurrency("CNY");
request.setAmount(amount);

Payer payer = new Payer();
payer.setOpenid(orderData.getOpenid());
request.setPayer(payer);

return service.prepayWithRequestPayment(request);
}

// 查询订单
public Transaction queryOrder(String outTradeNo) {
QueryOrderByOutTradeNoRequest request = new QueryOrderByOutTradeNoRequest();
request.setOutTradeNo(outTradeNo);
return service.queryOrderByOutTradeNo(request);
}
}

配置文件

{
"wxpay": {
"appId": "your_app_id",
"mchId": "your_mch_id",
"apiKey": "your_api_key",
"privateKeyPath": "./cert/apiclient_key.pem",
"notifyUrl": "https://your-domain.com/api/wxpay/notify"
}
}