微信支付:api解析

微信支付

小程序支付接口

小程序下单

请求方式:【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)接收异步请求更新订单结果


用户查看支付结果时,请求小程序端请求支付服务向微信发起查询请求,微信返回支付结果时,支付服务对数据库中的订单支付结果进行修改返回用户


用户发起退款时,请求小程序端请求支付服务向微信发起退款申请,微信返回退款结果,支付服务修改数据库中的退款状态返回给用户查看

相关推荐
小钱c72 小时前
Mac下安装Apache JMeter并启动
jmeter·macos·apache
陈思杰系统思考Jason8 小时前
系统思考—深层结构
百度·微信·微信公众平台·新浪微博·微信开放平台
ysdysyn1 天前
C# winfrom实现微信(其他应用)自动跟随C#窗口,拖动页面自动恢复到固定位置
开发语言·微信·c#·winform
程序员入门进阶1 天前
基于微信的追星小程序+ssm(lw+演示+源码+运行)
微信·小程序
FserSuN2 天前
Apache Calcite - 查询优化之自定义优化规则
apache·calcite
黑风风2 天前
Ubuntu 22 安装 Apache Doris 3.0.3 笔记
笔记·ubuntu·apache
2401_844139032 天前
Java爱情交友婚恋系统小程序源码
微信·微信小程序·小程序·微信公众平台·交友·微信开放平台
网络安全指导员2 天前
常见网络安全设备默认口令
服务器·网络·安全·web安全·php·apache
somgl3 天前
Wecom酱搭建企业微信发送消息
微信
Mr_Xuhhh3 天前
Linux第一个小程序-进度条
linux·运维·visualstudio·小程序·编辑器·apache