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


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


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

相关推荐
2601_961845153 天前
粉笔行测题库|系统班|刷题
网络·百度·微信·微信公众平台·facebook·新浪微博
小小龙学IT4 天前
Apache Airflow 2.x 深度指南:用 Python 编排一切的现代化工作流引擎
开发语言·python·apache
Shepherd06194 天前
【IT 运维】Apache 使用 mod_remoteip 恢复 Cloudflare 后的真实访客 IP
运维·tcp/ip·apache
isyangli_blog4 天前
SDN 基本应用实践 —— 使用命令行实现简易防火墙功能实验报告
服务器·php·apache
weikecms4 天前
聚合返利CPS小程序快速搭建教程
人工智能·微信·小程序
小小龙学IT5 天前
Apache Pulsar 深度解析:从架构设计到生产落地
apache
Full Stack Developme5 天前
Apache Tika 教程
java·开发语言·python·apache
沉默王二6 天前
用Codex+iLink Bot API给Agent接入微信,基于这个开源Skill
微信·agent·claude
laplaya6 天前
C++大型项目组件通信与依赖管理实践
c++·log4j·apache
Szime6 天前
小批量电子元器件采购为什么更难?从研发打样到试产交付
微信