lhl880520 2023-05-06 00:06 采纳率: 0%
浏览 35
已结题

PHP 如何使用v3支付

问题:
#API证书是通过证书工具下载生成(windows版本 :https://wx.gtimg.com/mch/files/WXCertUtil.exe)%E7%9A%84%E3%80%82%E5%B9%B6%E4%B8%94%E6%94%BE%E5%88%B0%E4%BA%86%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%8B%EF%BC%8C%E5%9C%A8PHP%E5%8A%A0%E8%BD%BD%E8%AF%81%E4%B9%A6%E6%97%B6curl_exec%E8%BF%94%E5%9B%9E%E7%9A%84%E9%94%99%E8%AF%AF%E4%BF%A1%E6%81%AF%E6%97%B658%EF%BC%8C%E6%A0%B9%E6%8D%AE%E9%94%99%E8%AF%AF%E5%AF%B9%E6%AF%94%EF%BC%8C%E8%AF%B7%E9%97%AE%E5%A6%82%E4%BD%95%E8%A7%A3%E5%86%B3%EF%BC%9F
#代码片段:

/**
     * 微信支付请求接口(POST)
     * @param string $openid     openid
     * @param string $body         商品简单描述
     * @param string $order_sn  订单编号
     * @param string $total_fee 金额
     * @param string $notify_url 回调地址
     * @return  json的数据
     */
    public function wxpay($openid,$total_fee,$body,$order_sn,$notify_url){
        $config = $this->config;
        
        //统一下单参数构造
        $unifiedorder = array(
            'appid'            => $config['appid'],
            'mch_id'        => $config['mch_id'],
            'nonce_str'        => self::getNonceStr(),
            'body'            => $body,
            'out_trade_no'    => $order_sn,
            'total_fee'        => $total_fee * 100,
            'spbill_create_ip'    => self::getip(),
            'notify_url'    => 'http://'.$_SERVER['HTTP_HOST'].'/notify.php',
            'trade_type'    => 'JSAPI',
            'openid'        => $openid
        );
        $unifiedorder['sign'] = self::makeSign($unifiedorder);
        
        //return $unifiedorder;
        
        //请求数据,统一下单
        $xmldata = self::array2xml($unifiedorder);
        $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';
        $res = self::curl_post_ssl($url, $xmldata);
        Log::record("curl_post_ssl   返回");
        Log::record($res);
        if(!$res){
            return array('status'=>0, 'msg'=>"Can't connect the server" );
        }
        // 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了
        //file_put_contents('./log.txt',$res,FILE_APPEND);
        
        $content = self::xml2array($res);
        if(strval($content['result_code']) == 'FAIL'){
            return array('status'=>0, 'msg'=>strval($content['err_code']).':'.strval($content['err_code_des']));
        }
        if(strval($content['return_code']) == 'FAIL'){
            return array('status'=>0, 'msg'=>strval($content['return_msg']));
        }
        
        $time = time();
        settype($time, "string");          //jsapi支付界面,时间戳必须为字符串格式
        $resdata = array(
            'appId'          => strval($content['appid']),
            'nonceStr'      => strval($content['nonce_str']),
            'package'       => 'prepay_id='.strval($content['prepay_id']),
            'signType'        => 'MD5',
            'timeStamp'        => $time
        );
        $resdata['paySign'] = self::makeSign($resdata);
        
        return json_encode($resdata);
    }
/**
     * 微信支付发起请求
     */
    protected function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){
        $config = $this->config;
        
        $ch = curl_init();
        //超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');
        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0);
        curl_setopt($ch, CURLOPT_SSLVERSION, 1);
        
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        //curl_setopt($ch,CURLOPT_SSLCERT,$config['api_cert']);
        
        curl_setopt($ch,CURLOPT_SSLCERT, ROOT_PATH.'/public/wxcert/'. 'apiclient_cert.pem');
        
        
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        //curl_setopt($ch,CURLOPT_SSLKEY,$config['api_key']);
        curl_setopt($ch,CURLOPT_SSLKEY,ROOT_PATH.'/public/wxcert/'. 'apiclient_key.pem');
        
        //curl_setopt($ch,CURLOPT_CAINFO,$config['rootca']);
        Log::record("call api_cert, api_cert:".$config['api_cert']);
        if( count($aHeader) >= 1 ){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }
     
        curl_setopt($ch,CURLOPT_POST, true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xmldata);
        **$data = curl_exec($ch);**
        if($data){
            curl_close($ch);
            return $data;
        }else { 
            $error = curl_errno($ch);
            echo "call faild, errorCode:$error\n"; 
        **    Log::record("call faild, errorCode:".$error);**//此处返回:58错误代码
            curl_close($ch);
            return false;
        }
    }



#根据错误代码查看:

img

      Not used in modern versions
 CURLE            SSL        CERTPROBLEM                        (58)
     problem with the local client certificate.
           SSL  CURLE                    CLPHER               (59

各位,这个问题如何解决啊

  • 写回答

3条回答 默认 最新

  • qq_37749055 2023-05-09 15:40
    关注
    获得7.50元问题酬金
    <?php
    
    require_once('vendor/autoload.php');
    
    use WeChatPay\Builder;
    use WeChatPay\Crypto\Rsa;
    use WeChatPay\Util\PemUtil;
    
    // 设置参数
    
    // 商户号
    $merchantId = '190000****';
    
    // 从本地文件中加载「商户API私钥」,步骤2生成的API私钥文件
    $merchantPrivateKeyFilePath = 'file:///path/to/merchant/apiclient_key.pem';
    $merchantPrivateKeyInstance = Rsa::from($merchantPrivateKeyFilePath, Rsa::KEY_TYPE_PRIVATE);
    
    // 「商户API证书」的「证书序列号」,步骤2生成的序列号
    $merchantCertificateSerial = '3775B6A45ACD588826D15E583A95F5DD********';
    
    //「微信支付平台证书」,步骤3生成的证书
    $platformCertificateFilePath = 'file:///path/to/wechatpay/cert.pem';
    $platformPublicKeyInstance = Rsa::from($platformCertificateFilePath, Rsa::KEY_TYPE_PUBLIC);
    
    // 从「微信支付平台证书」中获取「证书序列号」,步骤3生成的证书
    $platformCertificateSerial = PemUtil::parseCertificateSerialNo($platformCertificateFilePath);
    
    // 构造一个 APIv3 客户端实例
    $instance = Builder::factory([
        'mchid'      => $merchantId,
        'serial'     => $merchantCertificateSerial,
        'privateKey' => $merchantPrivateKeyInstance,
        'certs'      => [
            $platformCertificateSerial => $platformPublicKeyInstance,
        ],
    ]);
    
    // 发送请求
    $resp = $instance->chain('v3/certificates')->get(
        ['debug' => true] // 调试模式,https://docs.guzzlephp.org/en/stable/request-options.html#debug
    );
    echo $resp->getBody(), PHP_EOL;
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 修改了问题 5月6日
  • 修改了问题 5月6日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么