跳到主要内容

微信支付

简介​

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

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

参考资料​

支付流程​

关键代码实现​

前端调用(JavaScript)​

// 引入微信JSSDK
// CDN: <script src="https://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
// npm: npm install weixin-js-sdk

// wx.config 的签名参数需由后端的 JS-SDK 签名接口下发
wx.config({
debug: false,
appId: 'your_app_id',
timestamp: '',
nonceStr: '',
signature: '',
jsApiList: ['chooseWXPay']
});

// 发起支付请求
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();

wx.chooseWXPay({
timestamp: payParams.timeStamp,
nonceStr: payParams.nonceStr,
package: payParams.package,
signType: 'RSA',
paySign: payParams.paySign,
success: () => {
// 支付成功,跳转结果页或轮询订单状态,最终状态以后端异步通知为准
},
fail: () => {
// 支付失败或取消,提示用户重试
}
});
}

后端实现​

// 使用微信官方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.getApiV3Key())
.build();
this.service = new JsapiServiceExtension.Builder().config(config).build();
}

// 统一下单:返回值含 timeStamp、nonceStr、packageVal、paySign,供前端 wx.chooseWXPay 使用
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",
"apiV3Key": "your_api_v3_key",
"serialNo": "your_merchant_cert_serial_no",
"privateKeyPath": "./cert/apiclient_key.pem",
"platformCertPath": "./cert/wechatpay_platform_cert.pem",
"platformCertSerial": "platform_cert_serial_no",
"notifyUrl": "https://your-domain.com/api/wxpay/notify"
}
}