前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信支付V3

微信支付V3

原创
作者头像
用户2895856
发布2023-11-16 16:17:16
3270
发布2023-11-16 16:17:16
举报
文章被收录于专栏:我的开发日记
代码语言:javascript
复制

use GuzzleHttp\Client;

class WxPay
{
    private $appId = 'wxd3073***045a';
    private $mchId = '149***8522';
    private $notifyUrl = 'http://a.com';
    private $apiclientKey = '';
    private $client;
    private $serialNo = '5C758F2A5***DA29944CA4938';

    public function __construct()
    {
        $this->apiclientKey = file_get_contents('apiclient_key.pem');
        $this->client = new Client([
            'base_uri' => 'https://api.mch.weixin.qq.com',
            'timeout' => 5,
            'verify' => false,
            'http_errors' => false,
        ]);
    }

    public function getSign($data)
    {
        $str = implode("\n", array_merge($data, ['']));
        openssl_sign($str, $signature, $this->apiclientKey, OPENSSL_ALGO_SHA256);
        return base64_encode($signature);
    }

    // JSAPI下单 description,out_trade_no,amount,payer
    public function jsapi($param)
    {
        $method = 'POST';
        $api = '/v3/pay/transactions/jsapi';
        $timestamp = time();
        $nonce = uniqid();

        $data = array_merge($param, [
            'appid' => $this->appId,
            'mchid' => $this->mchId,
            'notify_url' => $this->notifyUrl,
        ]);

        $authorization = $this->getAuthorization($method, $api, json_encode($data));

        $r = $this->client->request($method, $api, [
            'headers' => [
                'Accept' => 'application/json',
                'Content-Type' => 'application/json',
                'Authorization' => $authorization,
            ],
            'json' => $data
        ]);

        $res = json_decode($r->getBody()->getContents(), 1);
        if (!isset($res['prepay_id'])) return $res;

        $package = 'prepay_id=' . $res['prepay_id'];
        $paySign = $this->getSign([$this->appId, $timestamp, $nonce, $package]);

        return [
            'appId' => $this->appId,
            'timeStamp' => $timestamp,
            'nonceStr' => $nonce,
            'package' => $package,
            'signType' => 'RSA',
            'paySign' => $paySign,
        ];
    }

    // 商户订单号查询订单
    public function findOrder($orderNo)
    {
        $method = 'GET';
        $api = "/v3/pay/transactions/out-trade-no/{$orderNo}?mchid={$this->mchId}";
        $authorization = $this->getAuthorization($method, $api);

        $r = $this->client->request($method, $api, [
            'headers' => [
                'Accept' => 'application/json',
                'Authorization' => $authorization,
            ]
        ]);

        return $r->getBody()->getContents();
    }

    public function getAuthorization($method, $api, $body = '')
    {
        $timestamp = time();
        $nonce = uniqid();
        $signature = $this->getSign([$method, $api, $timestamp, $nonce, $body]);
        $authorization = sprintf(
            'WECHATPAY2-SHA256-RSA2048 mchid="%s",serial_no="%s",timestamp="%s",nonce_str="%s",signature="%s"',
            $this->mchId, $this->serialNo, $timestamp, $nonce, $signature
        );

        return $authorization;
    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档