微信小程序支付
商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按Native、JSAPI、App等不同场景生成交易串调起支付。
请求地址:
二、请求地址:
| 参数名 | 类型 | 说明 | 示例 |
|---|---|---|---|
| appid | String | 合作伙伴Id | |
| timestamp | String | 时间戳 | 请求时的时间,unixtime格式 |
| mch_id | String | 商户ID | 向蜂巢客服咨询获取 |
| ext_trade_no | String | 开发者传入的订单 , 比如1586420573605 | 不可传入重复的订单号,此订单号在付款完成后,推送回调时一同返回,开发者可以根据此订单号进行业务逻辑处理。 |
| ext_buyer | String | 开发者传入的下单购买者标识 | 手机号,邮箱,用户ID等任意用户标识。 |
| amount | int | 付款金额,单位分 | 比如 350, 表示3.5 元。 |
| attach | String | 附加参数,200字以内 | 支付完成回调时原样返回给开发者。 |
| body | String | 商品说明 | |
| notify_url | String | 支付完成后的异步回调通知Url | 比如, http(s)://yoururl.com/paynotify ,确保公网可访问 |
| sub_appid | String | 必填, 用户在子商户AppID下的唯一标识 | 商户自己的微信小程序appId |
| sub_openid | String | 必填, 用户在子商户AppID下的唯一标识 | 买家在商户微信小程序里的openid |
| sign | String | 签名 | 对各参数使用提供的AppSecret进行签名,签名逻辑具体实现见示例代码 |
请求示例
@Test
public void PayWXCreateH5Pay() throws Exception {
//支付金额 (单位分)
String amount ="1000";
String mchId ="163588 "; //由蜂巢提供的微信商户号,向客服咨询
// 确保传入的开发者订单号唯一, 订单号生成规则开发者可自定, 修改
String ext_trade_no =String.valueOf(System.currentTimeMillis());
// 扩展参数,付款成功时回调给开发者时会原样返回,根据自己需求填写或为空。
String attach ="";
// 订单标题
String body ="支付测试商品08";
// 回调通知url,开发者自己的服务器Url
String notify_url = Config.PayNotifyUrl;
//业务参数
Map<String, String> data = new HashMap<String, String>();
data.put("appid", Config.AppId);
Long timestamp = System.currentTimeMillis() / 1000;
data.put("timestamp", timestamp.toString());
data.put("ext_trade_no",ext_trade_no );
data.put("mch_id",mchId );
data.put("amount",amount );
data.put("attach",attach );
data.put("body" , body );
data.put("notify_url",notify_url );
data.put("sub_appid","wx168f3faec71f8488" );
data.put("sub_openid","oR-0h4_3s-sBC9zs1go4xg81yWJh" );
data.put("sign", Utils.Sign(data, Config.AppSecret ));
String result = doHttpRequest(Config.PayWXPersonalCreateH5PayUrl,data);
System.out.println("result:"+result);
JSONObject rsp = JSON.parseObject(result);
if (rsp.getInteger("code") == 0){
JSONObject rspData = rsp.getJSONObject("data");
String payUrl = URLDecoder.decode(rspData.getString("h5pay_url"),"utf-8");
System.out.println("请在手机浏览器点击此Url跳去支付:"+payUrl);
} else {
System.out.println("返回错误:" + rsp.getString("message"));
}
}
三、接口返回结果:
{
"code": 0,
"message": "ok",
"data": {
"appId": "wx168f3faec71f846a",
"nonceStr": "40D082E2C6AC528A730B85911DACC54D",
"package": "prepay_id=wx151958164112143d8faf3c56da61a40000",
"paySign": "oGrG3lP+8nfif41mffYDvA7np6Z7Mfz/PULBMURh9vwszCymlNAajPP/GEaEJ2d1J689WSa6I8C/TrVHCOnFj5RTh2/0WmBLdFkC7jfm28K33LqTUbs9dOUSBSoaUYu/YC9iI4YXgo41Mqav9KrhqnJam+qVz/lsv00tNf3OZZf9GC9ceT70JqK+3iZguOBX/4EcSJqMFX4CuV8YVSk/kyzv+RgD47HX8k4ZC+cAGGPrkGwUDse6QRz+/dkcrvccJZ0tMglwT1ZtWGIH2kpkXvL6SvtPeqXh6EEl8GLU91/ELu+H8DIp+yUdwQipWCujWpS4bDu6G+3JlD2q3w4leg==",
"prepayId": "wx151958164112143d8faf3c56da61a40000",
"signType": "RSA",
"timeStamp": "1784116696"
},
"trace_id": "03ae9774-90d1-4773-a5d7-ca1914e57e62"
}
返回参数说明
| 字段 | 类型 | 说明 |
|---|---|---|
code |
int | 业务状态码。0 表示成功,非 0 表示失败 |
message |
string | 结果描述。成功时为 ok,失败时为具体错误信息 |
data |
object | 成功时返回调起支付参数;失败时通常为空或不存在 |
trace_id |
string | 本次请求追踪 ID,排查问题时提供给蜂巢客服 |
data 字段(调起微信支付)
| 字段 | 类型 | 说明 |
|---|---|---|
appId |
string | 调起支付使用的小程序 AppID。 |
timeStamp |
string | 时间戳(秒,字符串)。用于签名,须原样传给 wx.requestPayment |
nonceStr |
string | 随机字符串。用于签名,须原样传给 wx.requestPayment |
package |
string | 预支付交易会话标识,固定格式:prepay_id={prepayId} |
signType |
string | 签名类型,固定为 RSA |
paySign |
string | 支付签名。由蜂巢按微信支付 V3 规则生成,小程序端直接透传,勿自行重算 |
prepayId |
string | 微信预支付交易会话 ID,有效期 2 小时。package 字段中已包含,也可单独读取 |
四、小程序调起示例
收到接口返回的支付所要的数据,在小程序里调用wx.requestPayment方法,传入参数,唤起微信收银台。
wx.request({
url: 'https://your-api.com/pay/wx/jsapi', //这是你自己业务系统提供api,按实修改。
method: 'POST',
data: { orderId: '20260715001' }, // 必要入参传入自己的业务系统,按实修改。
success(res) {
if (res.data.code !== 0) {
wx.showToast({ title: res.data.message, icon: 'none' });
return;
}
const d = res.data; // 蜂巢网关返回的 data
wx.requestPayment({
timeStamp: d.timeStamp,
nonceStr: d.nonceStr,
package: d.package,
signType: d.signType,
paySign: d.paySign,
success() {
// 仅表示调起成功,最终以 notify_url 异步通知为准
wx.showToast({ title: '支付成功', icon: 'success' });
},
fail(err) {
if (err.errMsg.indexOf('cancel') !== -1) {
wx.showToast({ title: '已取消支付', icon: 'none' });
} else {
wx.showToast({ title: '支付失败', icon: 'none' });
}
}
});
}
});
上述 5 个字段(timeStamp、nonceStr、package、signType、paySign)须与接口返回完全一致,不可修改或重新签名。
支付结果以微信异步通知 + 商户侧查单为准;wx.requestPayment 的 success 仅表示调起成功,不代表资金已到账。建议小程序里弹出支付成功以后,跳到订单状态页面轮询订单支付状态是否真正成功。
文档更新时间: 2026-07-15 20:32 作者:admin