微信支付: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)接收异步请求更新订单结果


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


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

相关推荐
java_logo13 分钟前
Apache Doris Docker 部署指南:实时分析数据库实战
数据库·docker·apache·doris·apache doris·轩辕镜像·docker部署doris
Zhu75820 小时前
在k8s环境部署Apache Superset最新版
容器·kubernetes·apache
Zhu75820 小时前
在k8s环境部署Apache zookeeper3.9.5,高可用,多pod
容器·kubernetes·apache
毛丫讲绘本3 天前
独立老师开始做绘本课,怎样做少走弯路?
人工智能·学习·微信·微信公众平台·微信开放平台
程序猿乐锅3 天前
【苍穹外卖 day11|统计报表接口与 Apache ECharts 图表展示】
前端·apache·echarts
行思理3 天前
微信支付“商家转账用户确认模式”,新手教程
java·开发语言·微信
wechatbot8884 天前
企业微信 AI 自动化运营:RPA 与 API 方案效果实测
人工智能·微信·自动化·企业微信·rpa
硬核科技牛4 天前
AI生成的小程序,数据能导出换平台吗
小程序·apache
观远数据4 天前
连锁零售的BI落地清单:从门店日报到智能补货的6步推进路径
apache·零售
似璟如你5 天前
IoTDB 从零入门:安装、部署与第一个时序数据写入(Windows版本)
apache·时序数据库·iotdb