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


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


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

相关推荐
檀越剑指大厂5 小时前
开源多场景问答社区论坛Apache Answer本地部署并发布至公网使用
开源·apache
nvd115 小时前
Java ETL - Apache Beam 简介
java·apache·etl
2401_856654511 天前
员工疯狂打CALL!解锁企业微信新玩法,2024年必学秘籍来啦!
安全·微服务·微信·电脑·企业微信
龙哥·三年风水1 天前
微信支付开发-前端api实现
微信·php·支付系统
兮动人1 天前
错误: 找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
分布式·zookeeper·apache
凌晨五点的星1 天前
网络安全-利用 Apache Mod CGI
apache
鲸天千流3 天前
鲸天科技外卖会员卡系统更专业
网络·科技·微信·小程序
一 乐3 天前
学习平台|基于java的移动学习平台系统小程序(源码+数据库+文档)
java·数据库·学习·小程序·论文·apache
2401_845937533 天前
PHP即刻送达同城派送小程序系统
微信·微信小程序·小程序·微信公众平台·微信开放平台
weixin_436525073 天前
【安全漏洞】Apache Tomcat 高危漏洞版本
java·apache