装备材料

  • 需要支付的主体(小程序,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
其他文章链接

  1. 安装composer包
composer require wechatpay/wechatpay
  1. 查询当前可用命令,提示 Available binaries: - CertificateDownloader.php 为正确,不然就升级composer 后重新安装
composer exec -l
  1. 重试执行 命令,会打印出使用说明的
composer exec CertificateDownloader.php
  1. 执行命令,会把证书下载到刚建了文件夹里面
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相关推荐

  1. 2020微信支付v3版本java对接详细流程

    都0202年,我似乎翻遍了百度,都没找到最新版微信支付v3的对接相关的详细博客,我都纳闷了,只有自己摸索.还有就是竟然还有人用一些v3对接的假代码,来骗积分,我真的服了,感同身受,以下是我对接的过程, ...

  2. 微信支付v3版本npm包

    wechatpay-node-v3 # 微信支付v3 支持在ts和js中使用 欢迎大家加入一起完善这个api 前言 微信官方在2020-12-25正式开放了v3版本的接口,相比较旧版本v2有了不少改变 ...

  3. 微信支付V3版 java

    微信支付V3版 1.引入依赖 2.创建时间工具类 DateTimeZoneUtil.class 3.解密工具类 AesUtil.class 4.对外暴露方法 公共参数 4-1.支付下单 V3PayGe ...

  4. springboot利用官方SDK(wechatpay-apache-httpclient)接入微信支付V3

    利用微信官方提供的SDK wechatpay-apache-httpclient 实现.以微信小程序支付为例,其他支付也是一样的,就是参数和接口地址不同. 微信支付V3文档 首先要在微信商户平台设置好 ...

  5. PHP实现对微信支付v3版本的订单查询

    PS:本文只是对微信支付v3订单的查询流程的介绍,如果要实际使用请按照自身需求对代码进行修改,本文中调用了部分其他文件的方法,我会放在链接里请前往其他文章进行查看,本文采用的是使用商户订单号查询,若是 ...

  6. 微信支付V3版本的 签名生成,验签,解密,统一下单的简单封装

    微信支付 V3版本的 签名生成,验签,解密,统一下单的简单封装 V3Base 获取平台证书 回调报文解密 统一下单 暂时看了文档只完成了这部分,感觉封装的不是特别完美,希望有大佬指点一下,想着封装好一 ...

  7. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  8. java微信支付v3系列——1.微信支付准备工作

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  9. SpringBoot集成微信支付V3

    河南循中网络科技有限公司 - 精心创作,详细分解,按照步骤,均可成功! 文章目录 吐槽! 此文章包含实现了哪些接口? 学习资料 集成微信支付V3 什么是"商户证书"?什么是&quo ...

最新文章

  1. 发布AI操作系统、应用市场,开源机器学习数据库和AI操作系统内核,第四范式这波操作有点秀!
  2. SAP PM交叉申请时间表
  3. uc3842开关电源电路图_UC3842构成的开关电源电路
  4. CentOS学习日记:PostgreSQL篇
  5. Kmeans、Kmeans++和KNN算法比较
  6. vbs用mysql语句查询数据库_vbs脚本实现window环境下的mysql数据库的备份及删除早期备份...
  7. 最新的Windows phone Developer tools RTW 发布了
  8. 【个人笔记】《知了堂》node.js简介及创建应用
  9. 蓝桥杯试题开灯游戏c语言,[蓝桥杯][算法提高VIP]开灯游戏 (C++代码)
  10. 值-结果参数(socket编程中的函数举例)
  11. Cesium加载GeoServer发布的SHP和GeoTIFF文件
  12. matlab免疫算法求解配送中心选址问题
  13. 平面几何----用角平分线逆定理证明阿氏圆定理
  14. 常用十六进制颜色对照表代码
  15. 利用IPv6看清晰流畅的网络电视
  16. obsutil相关 (桶相关操作Linux)
  17. vue前端框架有哪些
  18. Postgresql日期转字符串
  19. python3爬取图片
  20. 原生CANVAS语法实现的封装折线图和饼图

热门文章

  1. python中{:.2}和{:.2f}区别
  2. UML之行为图(活动图、状态图、交互图)
  3. 全球各大邮件SMTP服务限制
  4. 模具CNC加工质量高低应考虑哪些方面
  5. 如何使用httpclient进行NTLM认证登录
  6. React框架:1、React简介
  7. 【Kevin Learn QMUI】--> QMUIBottomSheet
  8. 用Python绘制百度风格地图
  9. 7秒钟写14篇稿件,AI机器人会掀起记者失业大潮么?
  10. 判断是为魅族系统(Flyme OS)