码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微信 商家转账到零钱 二


    本来想手写,但是有sdk 就没必要这么麻烦。

    composer地址:wechatpay/wechatpay - Packagist

    微信官网sdk,给的是github,打不开。

    一 sdk使用

    1. require_once 'vendor/autoload.php';
    2. defined('ROOT_PATH') or define('ROOT_PATH', './');
    3. use WeChatPay\Builder;
    4. use WeChatPay\Crypto\Rsa;
    5. use WeChatPay\Util\PemUtil;
    6. class Test
    7. {
    8. public function payconfig2()
    9. {
    10. $config = [
    11. 'appid' => 'appid',
    12. 'mchid' => '商户号',
    13. 'key' => 'key',
    14. 'serial_no' => '证书序列号',
    15. ];
    16. return $config;
    17. }
    18. private function getpems()
    19. {
    20. $arr = [
    21. 'SSLCERT' => ROOT_PATH . "/cert/apiclient_cert.pem",
    22. 'SSLKEY' => ROOT_PATH . "/cert/apiclient_key.pem",
    23. ];
    24. return $arr;
    25. }
    26. public function dotest()
    27. {
    28. $pems = $this->getpems();
    29. $config = $this->payconfig2();
    30. $merchantPrivateKeyFilePath = file_get_contents($pems['SSLKEY']);
    31. $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
    32. // 「商户API证书」的「证书序列号」
    33. $merchantCertificateSerial = $config['serial_no'];
    34. $merchantId = $config['mchid'];
    35. // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
    36. $platformCertificateFilePath = file_get_contents($pems['SSLCERT']);
    37. $platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
    38. // 从「微信支付平台证书」中获取「证书序列号」
    39. $platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
    40. // 构造一个 APIv3 客户端实例
    41. $instance = Builder::factory([
    42. 'mchid' => $merchantId,
    43. 'serial' => $merchantCertificateSerial,
    44. 'privateKey' => $merchantPrivateKeyInstance,
    45. 'certs' => [
    46. $platformCertificateSerial => $platformPublicKeyInstance,
    47. ],
    48. ]);
    49. // 发送请求
    50. $resp = $instance->chain('v3/certificates')->get(
    51. ['debug' => true]// 调试模式,https://docs.guzzlephp.org/en/stable/request-options.html#debug
    52. );
    53. echo $resp->getBody(), PHP_EOL;
    54. }
    55. }
    56. $t = new Test();
    57. $t->dotest();

    证书序列号需要去商户平台看。

    其次这个key有v2、v3之分。问过别人这俩版本不共用。

    • 文件名是 apiclient_key.pem 的,是 「商户私钥」文件
    • 文件名是 apiclient_cert.pem 的,是 「商户证书」文件

    二 证书生成

    上面例子中用的SSLCERT证书可以用于退款,是从微信后台直接生成。而支付的证书需要使用这个框架中的代码生成。

    详见:https://github.com/wechatpay-apiv3/wechatpay-php

    composer exec CertificateDownloader.php -- -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}

    必须linux环境下运行,windows环境下运行不会生成证书。

    将生成的证书替换SSLCERT的值,就能正常运行了~ 因为是新生成的证书,不影响旧的证书,即不影响旧证书涉及的其他问题。

    三 参考

    微信支付:API商户证书序列号serialNo获取-YES开发框架网

    TP6下微信支付wechatpay-apiv3之wechatpay-php使用,包括下单、支付、查询、关闭_哈喽吧

    商户证书序列号有误。请使用签名私钥匹配的证书序列号?-CRMEB社区

  • 相关阅读:
    优化算法 -小批量随机梯度下降
    JavaScript 学习-50.实现页面菜单拖放(Drag 和 Drop)
    盲注原理基础
    基于redis实现互斥锁
    【Linux】文件IO基础知识——下篇, 什么是软硬链接?如何用别人的动静态库??
    区域气象-大气化学在线耦合模式(WRF/Chem)
    全波形反演的深度学习方法: 第二章 正演 (草稿)
    C++所有容器的详细使用介绍
    蓝桥杯官网练习题(斐波那契数列最大公约数)
    038:vue页面头部提示低版本浏览器升级问题
  • 原文地址:https://blog.csdn.net/lsswear/article/details/134295113
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号