微信支付
小程序支付接口
小程序下单
请求方式:【POST】/v3/pay/transactions/jsapi
请求域名:【主域名】https://api.mch.weixin.qq.com
请求方向:业务系统--->微信
请求体设置:
Content-Type:application/json
Accept:application/json
需要携带的参数
addId:小程序Id
mchId:商户号Id
description:商品描述
out_trade_no:商户的订单号
amount:订单的金额信息
微信返回
prepay_id
预支付交易会话标识
(如果是扫码支付会返回一个二维码)
签名认证
通过签名算法生成一串签名串放在Header的Authorization中作为接口的签名认证信息传入
生成签名
签名构成
java
//签名是一个五行的字符串签名串
HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n
eg:
GET\n
/v3/certificates\n
1554208460\n
593BEC0C930BF1AFEB40B4A08C8FB242\n
\n
签名
需要使用商户私钥对签名串进行一个SHA256 with RSA
非对称算法签名
并对签名结果进行Base64编码得到签名值转成二进制
java
String sign(byte[] message) {
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(yourPrivateKey);
sign.update(message);
return Base64.getEncoder().encodeToString(sign.sign());
}
验证签名
使用签名算法和公钥对原始信息进行解密,防止信息被篡改
小程序调起支付
微信返回一个prepay_id预支付会话标识
小程序使用微信支付的
wx.requestPayment(Object)方法发起微信支付
传入参数
timeStamp:时间戳
nonceStr:随机字符串
package:以prepay_id=...形式传入之前的预支付会话标识
signType:签名类型,只能为RSA
paySign:签名,上述计算出签名值
wx支付异步返回通知
通过下单传入的请求参数"notify_url"作为接口url接收
wx以POST方式访问商户设置的通知URL
返回的参数
id:通知id
create_time:创建通知时间
event_type:通知类型
resource_type:通知的资源数据类型
resource:通知资源数据
appId:小程序号
mchid:商户号
out_trade_no:商户内部订单号
transcation_id:微信支付系统生成的订单号
...
summary:回调摘要
根据订单号查询订单
请求方式:【GET】/v3/pay/transactions/out-trade-no/{out_trade_no}
请求域名:【主域名】https://api.mch.weixin.qq.com
请求方向:业务系统--->微信
需要携带订单号和商户号进行查询
返回参数
appId:小程序号
mchid:商户号
out_trade_no:商户内部订单号
transcation_id:微信支付系统生成的订单号
trade_state:订单状态
Native支付接口
总体流程与小程序支付一致
只是小程序的支付需要扫码支付
扫码下单
返回code_url,按url格式转成二维码即可
查询订单
仅接口地址不同
具体使用案例
java
//使用WechatPayHttpClientBuilder创建一个builder
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
.withWechatPay(wechatPayCertificates);
//得到一个httpclient
CloseableHttpClient httpClient = builder.build();
//使用这个client发起请求
CloseableHttpResponse response = httpClient.execute(...);
//execute()中的参数需要传入HttpPost或者HttpGet,略
业务场景
在我们的项目中整体的微信支付主要走的以下流程
用户先向小程序端发起支付请求
小程序端请求我们的支付服务
支付服务再请求微信接口进行下单
微信返回我们一个下单标识(如果是扫码就是二维码,如果是小程序支付就返回一个prepay_id即预支付会话标识,通过这个标识调用**wx.requestPayment()**发起微信支付)
用户随后输入密码或者扫码支付
微信收到支付请求后返回支付的结果通知(异步)
我们在代码中写一个接口(notifyurl)接收异步请求更新订单结果
用户查看支付结果时,请求小程序端请求支付服务向微信发起查询请求,微信返回支付结果时,支付服务对数据库中的订单支付结果进行修改返回用户
用户发起退款时,请求小程序端请求支付服务向微信发起退款申请,微信返回退款结果,支付服务修改数据库中的退款状态返回给用户查看