新版微信支付 v3 php uniapp
装备材料
- 需要支付的主体(小程序,app,公众号),去各自平台认证。APP去微信开放平台认证
- 微信商户号(注意需要同一个公司认证)
- 绑定关系(在商户号绑定,并且各自平台进行同意)
- 商户号,下载证书,设置密码 参考微信手册
使用SDK
github网址
//使用官方推荐的
composer require wechatpay/wechatpay
SDK 注意事项
//这里的证书需要使用 file_get_contents(),里面写具体路径
$merchantPrivateKeyFilePath = file_get_contents('file:///path/to/merchant/apiclient_key.pem');
// 微信支付平台证书 需要提前下载,并且也需要使用, file_get_contents()
$platformCertificateFilePath = file_get_contents('file:///path/to/wechatpay/cert.pem');
下载微信平台证书
我这里使用composer 下载证书,需要注意的是,thinkphp 不能直接使用,建议新建文件夹,从头一步一步来。不能使用thinkphp 的 vendor
其他文章链接
- 安装composer包
composer require wechatpay/wechatpay
- 查询当前可用命令,提示 Available binaries: - CertificateDownloader.php 为正确,不然就升级composer 后重新安装
composer exec -l
- 重试执行 命令,会打印出使用说明的
composer exec CertificateDownloader.php
- 执行命令,会把证书下载到刚建了文件夹里面
composer exec CertificateDownloader.php -- -m 你的商户号 -s 40字节你的商户证书序列号 -f 你的apiclient_key.pem文件路径 -k 你的APIv3密钥 -o .
执行下单(注意手册上面的不是使用推荐方法,不能使用手册方法)
这里需要根据自己的下单接口来编写,具体参考文档
比如:JSAPI 下单,就把chain 改为 v3/pay/transactions/jsapi
然后得到返回值,进行下一步,签名,签名后返回到前台进行下单
$merchantId = config('wx_mini')['mchid'];
// 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
$merchantPrivateKeyFilePath = file_get_contents('/xxxxxxxxxxx');
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = config('wx_mini')['zhengshu_no'];
// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
$platformCertificateFilePath = file_get_contents(xxxxxxxxxxx);
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
// 从「微信支付平台证书」中获取「证书序列号」
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
// 构造一个 APIv3 客户端实例
$instance = Builder::factory(['mchid' => $merchantId,'serial' => $merchantCertificateSerial,'privateKey' => $merchantPrivateKeyInstance,'certs' => [$platformCertificateSerial => $platformPublicKeyInstance,],
]);try {$resp = $instance->chain('v3/pay/transactions/jsapi')->post(['json' => ['mchid' => config('wx_mini')['mchid'],"out_trade_no"=> $ji,"appid"=> config('wx_mini')['appid'],"description"=> "向商城付款","notify_url"=> config('wx_mini')['notify_url'],"amount"=> [//"total"=> (int)($data['money']*100),"total"=>1,"currency"=> "CNY"],"payer"=> ["openid"=> $user['openid_wx']]]]);if( $resp->getStatusCode()==200){$wo=json_decode($resp->getBody(),true); //prepay_id$params = ['appId' => config('wx_mini')['appid'],'timeStamp' => (string)Formatter::timestamp(),'nonceStr' => Formatter::nonce(),'package' => 'prepay_id='.$wo["prepay_id"],];$params += ['paySign' => Rsa::sign(Formatter::joinedByLineFeed(...array_values($params)),$merchantPrivateKeyInstance), 'signType' => 'RSA'];// Db::name('user_gu')->where('id')// echo json_encode($params);return ['code' => 1, 'message' => '微信支付成功','data'=>$params];}} catch (\Exception $e) {return ['code' => 0, 'message' => '微信支付错误'];// 进行错误处理echo $e->getMessage(), PHP_EOL;if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {$r = $e->getResponse();echo $r->getStatusCode() . ' ' . $r->getReasonPhrase(), PHP_EOL;echo $r->getBody(), PHP_EOL, PHP_EOL, PHP_EOL;}echo $e->getTraceAsString(), PHP_EOL;}
前台执行支付行为这里小程序举例
我是用的是uniapp
uni.requestPayment({provider: 'wxpay',timeStamp: config.timeStamp,nonceStr: config.nonceStr,package: config.package,signType: config.signType,paySign: config.paySign,success: function (res) {console.log('success:' + JSON.stringify(res));uni.common.back('支付成功')},fail: function (err) {console.log('fail:' + JSON.stringify(err));uni.common.msg('支付失败')}});
支付回调
先写好支付的回调地址,会接受到两个数据,一个是header 的数据一个是,body里面数据,使用file_get_contents(“php://input”); 接受数据
$info = Request::header();
$inWechatpaySignature = $info['wechatpay-signature'];
$inWechatpayTimestamp = $info['wechatpay-timestamp'];
$inWechatpaySerial = $info['wechatpay-serial'];
$inWechatpayNonce = $info['wechatpay-nonce'];
if (!$inWechatpaySignature or !$inWechatpayTimestamp or !$inWechatpaySerial or !$inWechatpayNonce) {header("Location:/404.html");exit;
}$inBody = file_get_contents("php://input");// 请根据实际情况获取,例如: file_get_contents('php://input');
$apiv3Key = config('wx_mini')['v3_secret'];// 在商户平台上设置的APIv3密钥
// 根据通知的平台证书序列号,查询本地平台证书文件,这里是自己生成的证书
$platformPublicKeyInstance = Rsa::from(file_get_contents(env('root_path').'zhengshu/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);// 使用PHP7的数据解构语法,从Array中解构并赋值变量['resource' => ['ciphertext' => $ciphertext,'nonce' => $nonce,'associated_data' => $aad]] = $inBodyArray;// 加密文本消息解密$inBodyResource = AesGcm::decrypt($ciphertext, $apiv3Key, $nonce, $aad);// 把解密后的文本转换为PHP Array数组$inBodyResourceArray = (array)json_decode($inBodyResource, true);// print_r($inBodyResourceArray);// 打印解密后的结果$result=$inBodyResourceArray;if ($result['trade_state'] == 'SUCCESS') {$out_trade_no = $result['out_trade_no'];$pay_money= $result['amount']['payer_total']/100;//更加订单号和支付金额执行自己逻辑// //分钱没有写呢// if ($fen) {// $this->fenqian($out_trade_no);// }return \json(["code"=> "SUCCESS","message"=> "成功"]);}
}
使用uniapp 进行 微信app内支付
和上面一样,区别是两个一个是预下单接口,一个是发起支付接口
预下单
$merchantId = config('wx_mini')['mchid'];
// 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
$merchantPrivateKeyFilePath = file_get_contents('xxxxxxx/zhengshu/wx/apiclient_key.pem');
$merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
// 「商户API证书」的「证书序列号」
$merchantCertificateSerial = config('wx_mini')['zhengshu_no'];
// 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
$platformCertificateFilePath = file_get_contents('/xxxxxx/zhengshu/wx/cert.pem');
$platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
// 从「微信支付平台证书」中获取「证书序列号」
$platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
// 构造一个 APIv3 客户端实例
$instance = Builder::factory(['mchid' => $merchantId,'serial' => $merchantCertificateSerial,'privateKey' => $merchantPrivateKeyInstance,'certs' => [$platformCertificateSerial => $platformPublicKeyInstance,],
]);try {$resp = $instance->chain('v3/pay/transactions/app')->post(['json' => ["appid"=> config('wx_mini')['kf_appid'],//这里使用开放平台的appid'mchid' => config('wx_mini')['mchid'],"description"=> "向商家付款","out_trade_no"=> $ji,"notify_url"=> config('wx_mini')['notify_url'],"amount"=> ["total"=> (int)($data['money']*100),//"total"=>1,"currency"=> "CNY"],// "payer"=> [// "openid"=> $user['openid_wx']// ]]]);if( $resp->getStatusCode()==200){$wo=json_decode($resp->getBody(),true); //prepay_id$params = ['appId' => config('wx_mini')['kf_appid'],'timeStamp' => (string)Formatter::timestamp(),'nonceStr' => Formatter::nonce(),'prepayId'=>$wo["prepay_id"],];$params += ['paySign' => Rsa::sign(Formatter::joinedByLineFeed(...array_values($params)),$merchantPrivateKeyInstance), 'signType' => 'RSA'];$params['partnerId']=config('wx_mini')['mchid'];$params['package'] = 'Sign=WXPay';return ['code' => 1, 'message' => '微信支付成功','data'=>$params];}} catch (\Exception $e) {return ['code' => 0, 'message' => '微信支付错误'];// 进行错误处理echo $e->getMessage(), PHP_EOL;if ($e instanceof \GuzzleHttp\Exception\RequestException && $e->hasResponse()) {$r = $e->getResponse();echo $r->getStatusCode() . ' ' . $r->getReasonPhrase(), PHP_EOL;echo $r->getBody(), PHP_EOL, PHP_EOL, PHP_EOL;}echo $e->getTraceAsString(), PHP_EOL;}
uniapp 内支付
uni.requestPayment({"provider": "wxpay", "orderInfo": {'appid':config.appId,'noncestr':config.nonceStr,'package':config.package,'partnerid':config.partnerId,'timestamp':config.timeStamp,'prepayid':config.prepayId,'sign':config.paySign,},success: function (res) {console.log('success:' + JSON.stringify(res));uni.common.back('支付成功')},fail: function (err) {console.log('fail:' + JSON.stringify(err));uni.common.msg('支付失败')}
})
关于其他的比如退款,分账等都类似,我就一一写了 多看微信商户手册就行
新版微信支付 v3 php uniapp相关推荐
- 2020微信支付v3版本java对接详细流程
都0202年,我似乎翻遍了百度,都没找到最新版微信支付v3的对接相关的详细博客,我都纳闷了,只有自己摸索.还有就是竟然还有人用一些v3对接的假代码,来骗积分,我真的服了,感同身受,以下是我对接的过程, ...
- 微信支付v3版本npm包
wechatpay-node-v3 # 微信支付v3 支持在ts和js中使用 欢迎大家加入一起完善这个api 前言 微信官方在2020-12-25正式开放了v3版本的接口,相比较旧版本v2有了不少改变 ...
- 微信支付V3版 java
微信支付V3版 1.引入依赖 2.创建时间工具类 DateTimeZoneUtil.class 3.解密工具类 AesUtil.class 4.对外暴露方法 公共参数 4-1.支付下单 V3PayGe ...
- springboot利用官方SDK(wechatpay-apache-httpclient)接入微信支付V3
利用微信官方提供的SDK wechatpay-apache-httpclient 实现.以微信小程序支付为例,其他支付也是一样的,就是参数和接口地址不同. 微信支付V3文档 首先要在微信商户平台设置好 ...
- PHP实现对微信支付v3版本的订单查询
PS:本文只是对微信支付v3订单的查询流程的介绍,如果要实际使用请按照自身需求对代码进行修改,本文中调用了部分其他文件的方法,我会放在链接里请前往其他文章进行查看,本文采用的是使用商户订单号查询,若是 ...
- 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装
微信支付 V3版本的 签名生成,验签,解密,统一下单的简单封装 V3Base 获取平台证书 回调报文解密 统一下单 暂时看了文档只完成了这部分,感觉封装的不是特别完美,希望有大佬指点一下,想着封装好一 ...
- java微信支付v3系列——6.微信支付查询订单API
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- java微信支付v3系列——1.微信支付准备工作
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- SpringBoot集成微信支付V3
河南循中网络科技有限公司 - 精心创作,详细分解,按照步骤,均可成功! 文章目录 吐槽! 此文章包含实现了哪些接口? 学习资料 集成微信支付V3 什么是"商户证书"?什么是&quo ...
最新文章
- 发布AI操作系统、应用市场,开源机器学习数据库和AI操作系统内核,第四范式这波操作有点秀!
- SAP PM交叉申请时间表
- uc3842开关电源电路图_UC3842构成的开关电源电路
- CentOS学习日记:PostgreSQL篇
- Kmeans、Kmeans++和KNN算法比较
- vbs用mysql语句查询数据库_vbs脚本实现window环境下的mysql数据库的备份及删除早期备份...
- 最新的Windows phone Developer tools RTW 发布了
- 【个人笔记】《知了堂》node.js简介及创建应用
- 蓝桥杯试题开灯游戏c语言,[蓝桥杯][算法提高VIP]开灯游戏 (C++代码)
- 值-结果参数(socket编程中的函数举例)
- Cesium加载GeoServer发布的SHP和GeoTIFF文件
- matlab免疫算法求解配送中心选址问题
- 平面几何----用角平分线逆定理证明阿氏圆定理
- 常用十六进制颜色对照表代码
- 利用IPv6看清晰流畅的网络电视
- obsutil相关 (桶相关操作Linux)
- vue前端框架有哪些
- Postgresql日期转字符串
- python3爬取图片
- 原生CANVAS语法实现的封装折线图和饼图