-- 创造无限可能

微信小程序支付接口开发:php

2023-07-17 14:18:24
253 人浏览 0 人点赞
有用,点赞支持一下

创建订单

$order = [
    'order_id'=>''
];
(new OrderModel())->save($order);
return prepay($order);
# 返回订单信息给前端

获取预支付id

public function prepay($data)
    {
        // 商户号
        $merchantId = '';
        // 从本地文件中加载「商户API私钥」,「商户API私钥」会用来生成请求的签名
        $merchantPrivateKeyFilePath = 'file://'.app()->getRootPath().'app\common\service\key\apiclient_key.pem';
        $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);

        // 「商户API证书」的「证书序列号」
        $merchantCertificateSerial = '4CC568D375E3F844C0CBE9C584D48B57E3C8F1E2';

        // 从本地文件中加载「微信支付平台证书」,用来验证微信支付应答的签名
        $platformCertificateFilePath =  'file://微信支付平台证书路径';
        $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'        => '商户号',
                    'out_trade_no' => '本地订单编号',
                    'appid'        => '',
                    'description'  => '商品描述',
                    'notify_url'   => '回调地址',
                    'payer'=>[
                        'openid'=>$data['openid'] // 支付用户openid
                    ],
                    'amount'       => [
                        'total'    => 1, // 订单金额
                        'currency' => 'CNY'
                    ],
                ]]);

            $data =  json_decode($resp->getBody(),true);
            $signData = $this->sign($data['prepay_id']);
            return $signData;

        } catch (\Exception $e) {
            // 进行错误处理
            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;
        }
    }

生成签名

private function sign($prepay_id){
        $data = [
            'appid'=>$this->config['appid'],
            'timeStamp'=>time(),
            'nonceStr'=>md5(time()),
            'package'=>'prepay_id='.$prepay_id,
        ];
        $str = $data['appid'] .'\n' . $data['timeStamp'] .'\n' . $data['nonceStr'] .'\n' . $data['package'];

        $merchantPrivateKeyFilePath = 'file://文件路径'; // 私钥地址
        openssl_sign($str, $raw_sign, openssl_get_privatekey(file_get_contents($merchantPrivateKeyFilePath)), 'sha256WithRSAEncryption');
        $sign = base64_encode($raw_sign);
        $data['prepay_id'] = $prepay_id;
        $data['signType'] = 'RSA';
        $data['paySign'] = $sign;
        return $data;
    }

前端调用

wx.requestPayment({
  timeStamp: '',
  nonceStr: '',
  package: '',
  signType: 'MD5',
  paySign: '',
  success (res) { },
  fail (res) { }
})