仅适用于 微信支付 v3
微信支付的文档真的很混乱,而且还经常更新,下文提及的链接可能会失效
[TOC]
需要申请三个账号,且都需要通过认证
公众平台: 服务号,小程序
商户平台: 支付相关
开放平台: app,网站
账号相关文档 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/ico-guide/chapter1_1.shtml
商户平台绑定 appid https://pay.weixin.qq.com/static/pay_setting/appid_protocol.shtml
凭据 | 获取途径 | 来源平台 |
---|---|---|
商户号 | 从商户平台的开户邮件中获取 | 商户平台 |
appid | 可以是公众平台里的服务号,小程序的appid,也可是开放平台里的app,网站的appid,反正就是和商户平台那个账号绑定了的就可以 | 公众平台 , 开放平台 |
公众号的 AppSecret | 在公众号后台设置,主要用在网页授权,因为微信内支付需要网页授权 | 公众平台 |
商户 API 证书 | 商户平台设置,需要使用证书工具生成(共包含三个文件: 证书 pkcs12 格式、证书 pem 格式、证书密钥 pem 格式) | 商户平台 |
商户 API 证书序列号 | 从商户 API 证书( pem 格式的证书)中获取 openssl x509 -in apiclient_cert.pem -noout -serial | 商户平台 |
APIv3 密钥 | 商户平台设置 | 商户平台 |
商户私钥 | 申请商户 API 证书后,保存在文件 apiclient_key.pem 中 | 商户平台 |
微信支付平台证书 | 通过 api 接口获取,这个要定时更新的 | 商户平台 |
微信支付平台平台公钥 | 从平台证书中获取 | 商户平台 |
https://kf.qq.com/faq/161222NneAJf161222U7fARv.html
openssl
git bash
已经带有 openssl
openssl
从商户平台的开户邮件中获取,商户平台的开户邮件大概是这样的
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=3_1
在公众平台或开放平台的后台用心找一下就能找到了,因为当前系统是用公众号的,所以一般是在公众平台的后台找
私钥和证书
https://wechatpay-api.gitbook.io/wechatpay-api-v3/ren-zheng/zheng-shu
如何申请api证书
https://kf.qq.com/faq/180824JvUZ3i180824YvMNJj.html (技术人员看这个)
https://kf.qq.com/faq/161222NneAJf161222U7fARv.html
https://kf.qq.com/faq/180824BrQnQB180824m6v2yA.html
从证书中获取证书序列号
openssl x509 -in 证书路径 -noout -serial
配置路径:【登录商户平台—>账户中心—>API安全—>APIv3密钥】
https://wechatpay-api.gitbook.io/wechatpay-api-v3/ren-zheng/api-v3-mi-yao
https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/ico-guide/chapter1_2.shtml
下载平台证书
第一次下载平台证书
java
https://github.com/wechatpay-apiv3/CertificateDownloader
java -jar CertificateDownloader.jar \
-k APIv3密钥 \
-m 商户号 \
-f 私钥路径 \
-s 商户API证书序列号 \
-o 下载平台证书的保存目录
php
https://github.com/wechatpay-apiv3/wechatpay-guzzle-middleware/tree/master/tool
php vendor/wechatpay/wechatpay-guzzle-middleware/tool/CertificateDownloader.php \
-k APIv3密钥 \
-m 商户号 \
-f 私钥路径 \
-s 商户API证书序列号 \
-o 下载平台证书的保存目录
从平台证书获取平台公钥
openssl x509 -in 平台证书路径 -pubkey -noout > XX.pem
查看证书有效日期
openssl x509 -in 证书路径 -noout -dates
查看证书内容
openssl x509 -in 证书路径 -noout -text
微信支付v3版的文档 https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/pages/index.shtml
微信支付有好多种,但只需要关注 普通直接模式 下的 Native支付 , h5支付 , jsapi支付 , 小程序支付
https://wechatpay-api.gitbook.io/wechatpay-api-v3/kai-fa-gong-ju
就是扫码支付。接口返回的是一个用来生成二维码的字符串
在手机浏览器调起微信支付。接口返回的是一个链接,让浏览器 302 转跳就好
在手机微信里支付。全程都在微信浏览器里,但需要有 oauth2 那个登录的 code
大致的流程
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml
和 jsapi支付 基本一致,只少了 appid 这个字段 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_4.shtml
这个是用在 jsapi支付 里的,主要是获取 oauth2 那个登录的 code
https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
大致的流程
这是 Native支付 支付回调的文档,每种支付方式的回调文档都有点不一样,但因为都很相似,所以实际代码是写得一样
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_5.shtml
php 里的代码大概写成这个样子,只是示例代码,实际代码千万不要写成这样
$input = file_get_contents("php://input");
$input = json_decode($input, true);
php 里的代码大概写成这个样子,只是示例代码,实际代码千万不要写成这样
$resourceJson = $input['resource']; // input 是上一步获取的变量
$associatedData = $resourceJson['associated_data'];
$nonceStr = $resourceJson['nonce'];
$ciphertext = $resourceJson['ciphertext'];
$aesUtil = new \WechatPay\GuzzleMiddleware\Util\AesUtil($aesKey); // aesKey 是 APIv3 密钥
$resource = $aesUtil->decryptToString($associatedData, $nonceStr, $ciphertext);
$resource = json_decode($resource, true); // 这是详细的回调内容
同样地每种支付方式的订单查询文档都有点不一样,但因为都很相似,所以实际代码是写得一样
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_2.shtml