thinkphp6中使用微信支付v3版本

1.引入SDK到项目中
composer require wechatpay/wechatpay-guzzle-middleware
2.引入Guzzle,Guzzle 将使用 PHP 流包装器发送 HTTP 请求
composer require guzzlehttp/guzzle:^7.0
3.在控制器中使用
use GuzzleHttp\Exception\RequestException;
use WechatPay\GuzzleMiddleware\WechatPayMiddleware;
use WechatPay\GuzzleMiddleware\Util\PemUtil;

// 商户相关配置
$merchantId = '1000100'; // 商户号
$merchantSerialNumber = 'XXXXXXXXXX'; // 商户API证书序列号
$merchantPrivateKey = PemUtil::loadPrivateKey('/path/to/mch/private/key.pem'); // 商户私钥
// 微信支付平台配置
$wechatpayCertificate = PemUtil::loadCertificate(app()->getRootPath().'/wechatpay_56E4BDC5960BB32054738D302C1943DD8630FA25.pem'); // 微信支付平台证书文件路径(我放在了项目根目录)

// 构造一个WechatPayMiddleware
$wechatpayMiddleware = WechatPayMiddleware::builder()
    ->withMerchant($merchantId, $merchantSerialNumber, $merchantPrivateKey) // 传入商户相关配置
    ->withWechatPay([ $wechatpayCertificate ]) // 可传入多个微信支付平台证书,参数类型为array
    ->build();

// 将WechatPayMiddleware添加到Guzzle的HandlerStack中
$stack = \GuzzleHttp\HandlerStack::create();
$stack->push($wechatpayMiddleware, 'wechatpay');

// 创建Guzzle HTTP Client时,将HandlerStack传入
$client = new \GuzzleHttp\Client(['handler' => $stack]);


// 创建Guzzle HTTP Client时,将HandlerStack传入,接下来,正常使用Guzzle发起API请求,WechatPayMiddleware会自动地处理签名和验签
$client = new \GuzzleHttp\Client(['handler' => $stack]);
    try {
      $resp = $client->request(
          'POST',
          'https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi', //请求URL
          [
              // JSON请求体
              'json' => [
                  "time_expire" => "2023-03-15T10:34:56+08:00",
                  "amount" => [
                      "total" => 10,
                      "currency" => "CNY",
                  ],
                  "mchid" => "16388714xx",
                  "description" => "测试",
                  "notify_url" => "https://xxx.com/admin/Login/notifyUrlApi",
                  "payer" => [
                      "openid" => "22CBI5G1ILObeNu1oHhGjLI7k2Cs",
                  ],
                  "out_trade_no" => "1217752501201407033233368018",
                  "goods_tag" => "WXG",
                  "appid" => "wx2d5db4945b8537xx",
                  "attach" => "自定义数据说明",
                  "scene_info" => [
                      "store_info" => [
                          "address" => "广东省深圳市南山区科技中一道10000号",
                          "area_code" => "440305",
                          "name" => "腾讯大厦分店",
                          "id" => "0001",
                      ],
                      "device_id" => "013467007045764",
                      "payer_client_ip" => "14.23.150.211",
                  ]
              ],
              'headers' => [ 'Accept' => 'application/json' ]
          ]
      );
   
      $statusCode = $resp->getStatusCode();
      if ($statusCode == 200) { //处理成功
          echo "success,return body = " . $resp->getBody()."\n";
      } else if ($statusCode == 204) { //处理成功,无返回Body
          echo "success";
      }
  } catch (RequestException $e) {
      // 进行错误处理
      echo $e->getMessage()."\n";
      if ($e->hasResponse()) {
          echo "failed,resp code = " . $e->getResponse()->getStatusCode() . " return body = " . $e->getResponse()->getBody() . "\n";
      }
      return;
  }
注意!!!:上面代码中配置证书不是商户公钥,一定要记住!!!下面是此配置讲解
// 微信支付平台配置
$wechatpayCertificate = PemUtil::loadCertificate('/path/to/wechatpay/cert.pem'); // 微信支付平台证书
微信支付平台证书 获取方式:
composer exec CertificateDownloader.php -- -k ${apiV3key} -m ${mchId} -f ${mchPrivateKeyFilePath} -s ${mchSerialNo} -o ${outputFilePath}

Options:
  -m, --mchid=<merchantId>   商户号
  -s, --serialno=<serialNo>  商户证书的序列号
  -f, --privatekey=<privateKeyFilePath>
                             商户的私钥文件
  -k, --key=<apiV3key>       ApiV3Key
  -o, --output=[outputFilePath]
                             下载成功后保存证书的路径,可选参数,默认为临时文件目录夹
  -u, --baseuri=[baseUri]    接入点,默认为 https://api.mch.weixin.qq.com/
  -V, --version              Print version information and exit.
  -h, --help                 Show this help message and exit.

例如:composer exec CertificateDownloader.php -- -k 123456789098765432116606169225 -m 1638871484 -f file:///www/wwwroot/daidai.qhwoyoung.com/apiclient_key.pem -s 7823EA0FFC9160F49C21F61ED277FC0A7A78410C -o file:///www/wwwroot/daidai.qhwoyoung.com/
回调函数处理:
 public function notifyUrlApi()
  {
    //接收返回数据
    $wechatRes = file_get_contents('php://input', 'r');
    $res = json_decode($wechatRes, true);
    $text =base64_decode($res['resource']['ciphertext']);
    //env("KEY")  -> 获取的是v3设置的密钥
    $new = sodium_crypto_aead_aes256gcm_decrypt($text,$res['resource']['associated_data'],$res['resource']['nonce'],env("KEY"));
    $new = json_decode($new, true);  
    if ($new['trade_state'] == 'SUCCESS') {
        //成功后操作流程写这里。。。
        echo '执行成功';
        $str='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
    }else{  
        $str='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>';  
    }

    return $str;
  }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容