1.先来上个官网文档地址:产品介绍-Native支付 | 微信支付商户平台文档中心
2.首先看文档中的接入前准备,先配置好验证微信数据所需的签名、appid,证书等数据内容。
3.下载官方提供的sdk包,到你的项目中,并配置好对应的命名空间,控制器方法引用。
4.打开sdk中的vendor/wechatpay/wechatpay/README.md文件。
5.复制证书下载的相关代码,复制到你的控制器方法中。商户api私钥和微信平台证书都是文件形式的,我放到了vendor同级目录的cert和apiclient_cert文件夹下。然后用绝对路径引用他们。(z证书文件要好好保存,要不然再次用会很麻烦)
6.验证证书签名成功后,就可以调用生成支付二维码链接的信息了。还是上个md文件
7.此步骤下面可以编写你的业务逻辑。(注意:微信支付金额是按分为单位,若你接口中传的1元,则你上图中total字段要乘以100才是1元)
8.异步回调验证签名:官方文档支付成功回调通知_Native支付|微信支付合作伙伴文档中心
<?php
/**
* 获取自定义的header数据
*/
function get_all_headers(){
// 忽略获取的header数据
$ignore = array('host','accept','content-length','content-type');
$headers = array();
foreach($_SERVER as $key=>$value){
if(substr($key, 0, 5)==='HTTP_'){
$key = substr($key, 5);
$key = str_replace('_', ' ', $key);
$key = str_replace(' ', '-', $key);
$key = strtolower($key);
if(!in_array($key, $ignore)){
$headers[$key] = $value;
}
}
}
return $headers;
}
public function wx_notify_url()
{
$headerarr=$this->get_all_headers();
testLog('notifyOrder', date('Y-m-d H:i:s') . "【微信充值正常测试回调data】\r\n" . json_encode($headerarr) . "\r\n");
$inWechatpaySignature = $headerarr['wechatpay-signature'];// 请根据实际情况获取
$inWechatpayTimestamp = $headerarr['wechatpay-timestamp'];// 请根据实际情况获取
$inWechatpaySerial = $headerarr['wechatpay-serial'];// 请根据实际情况获取
$inWechatpayNonce = $headerarr['wechatpay-nonce'];// 请根据实际情况获取
$inBody = file_get_contents("php://input");;// 请根据实际情况获取,例如: file_get_contents('php://input');
testLog('notifyOrder', date('Y-m-d H:i:s') . "【微信充值正常测试回调time】\r\n" . json_encode($inWechatpayNonce) . "\r\n");
$apiv3Key = "";
// 根据通知的平台证书序列号,查询本地平台证书文件,
// 假定为 `/path/to/wechatpay/inWechatpaySerial.pem`
$platformPublicKeyInstance = Rsa::from('file:///cert/wechatpay.pem', Rsa::KEY_TYPE_PUBLIC);
// 检查通知时间偏移量,允许5分钟之内的偏移
$timeOffsetStatus = 300 >= abs(Formatter::timestamp() - (int)$inWechatpayTimestamp);
$verifiedStatus = Rsa::verify(
// 构造验签名串
Formatter::joinedByLineFeed($inWechatpayTimestamp, $inWechatpayNonce, $inBody),
$inWechatpaySignature,
$platformPublicKeyInstance
);
if ($timeOffsetStatus && $verifiedStatus) {
// 转换通知的JSON文本消息为PHP Array数组
$inBodyArray = (array)json_decode($inBody, true);
$ciphertext = $inBodyArray['resource']['ciphertext'];
$nonce = $inBodyArray['resource']['nonce'];
$aad = $inBodyArray['resource']['associated_data'];
// 加密文本消息解密
$inBodyResource = AesGcm::decrypt($ciphertext, $apiv3Key, $nonce, $aad);
// 把解密后的文本转换为PHP Array数组
$result = (array)json_decode($inBodyResource, true);
if ($result["trade_state"] == "SUCCESS" && $result["trade_state_desc"] == "支付成功") {
//此处写支付成功后的业务逻辑
}
}
}
回调的所有数据都是在header头中获取的,上述代码有相关获取方式。
9.验证回调的数据可打印到某个文件中,若得到信息下面验证缺不通过,可把回调信息直接放到接口中去访问,看是哪一步出现了报错异常导致,希望我们都能尽快get到这个新技能。