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


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


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

相关推荐
s甜甜的学习之旅18 小时前
Apache POI练习代码
apache
是小崔啊18 小时前
开源轮子 - Apache Common
java·开源·apache
程序猿阿伟1 天前
《探索 Apache Spark MLlib 与 Java 结合的卓越之道》
java·spark-ml·apache
开心工作室_kaic1 天前
springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic
开发语言·数据库·vue.js·php·apache
cr.sheeper2 天前
Vulnhub靶场Apache解析漏洞
网络安全·apache
ccc_9wy3 天前
Apache Solr RCE(CVE-2017-12629)--vulhub
apache·solr·lucene·burp suite·vulhub·远程命令执行漏洞rce·cve-2017-12629
ccc_9wy3 天前
Apache Solr RCE(CVE-2019-0193)--vulhub
网络安全·apache·solr·lucene·vulhub·cve-2019-0193·远程命令执行漏洞rce
casual_clover3 天前
搭建一个简单的Web服务器(Apache2.4)
服务器·apache
李三醒3 天前
Apache Tomcat 漏洞CVE-2024-50379条件竞争文件上传漏洞 servlet readonly spring boot 修复方式
spring boot·tomcat·apache
鸠摩智首席音效师3 天前
Apache 如何监听多个端口 ?
apache