ThinkPHP 微信V3服务商支付

也不啰嗦了。
这是ThinkPHP 微信V3服务商支付 里面包含了获取sign. header 等所有方法。直接复制就能使用
接口调用 sppay 方法
在这里提一句 腾讯文档真的很垃圾 超级垃圾 写的给一坨屎一样

<?php
/*
 * @s: ========{================================================>
 * @version: 1.1.1
 * @Name: 文件:
 * @Author: Fcy
 * @Date: 2022-10-15 08:27:07
 * @FilePath: /application/api/controller/Wxpay.php
 * @E: ========{================================================>
 */
namespace app\api\controller;

use app\common\controller\Api;
class Wxpay extends Api
{

    protected $config = [
        'app_id'        => '',//appid
        'sp_appid'      => '',//服务商appid
        'sp_mchid'      => '',//服务商户号
        'sub_mchid'     => '',//子商户号
        'key'           => '',//密钥
        'serial_no'     => '',//证书序列号
        'api_cert'      =>  ROOT_PATH.'cert/apiclient_cert.pem',//证书
        'api_key'       => ROOT_PATH.'cert/apiclient_key.pem'   //私钥

    ];


    public function sppay($data)
    {
        $payData = [
            'sp_appid' => $this->config['sp_appid'],//服务商应用ID
            'sp_mchid' => $this->config['sp_mchid'],//服务商户号
            'sub_mchid' => $this->config['sub_mchid'],//子商户号
            'sub_appid' => $this->config['app_id'],
            'description' => $data['body'],//商品描述	
            'out_trade_no' => $data['out_trade_no'],//商户订单号
            'notify_url' => $data['notify_url'],//通知地址
            'amount' => [
                'total' => intval($data['total_fee']),
                'currency' => "CNY"
            ],
            'payer' => [
                "sub_openid" => ''//
            ]
        ];
        $url = "https://api.mch.weixin.qq.com/v3/pay/partner/transactions/jsapi";
        $headers = $this->sign('POST',$url,json_encode($payData));
        $data =  $this->curl_post($url,json_encode($payData),$headers);
        $prepay_id = json_decode($data, true);
        $appId = $this->config['app_id'];
        $timeStamp = strval(time());
        $nonceStr = getRandChar(30);
        $package = "prepay_id=".$prepay_id['prepay_id'];
        $signType = 'RSA';
        $resultData = [
            'appId' => $appId,
            'timeStamp' => $timeStamp,
            'nonceStr' => $nonceStr,
            'package' => $package,
            'signType' => $signType,
            'paySign' => $this->paySign($appId,$timeStamp,$nonceStr,$package),
        ];
        return $resultData;
    }

    public function paySign($appId,$timeStamp,$nonceStr,$package)
    {
        $mch_private_key = openssl_get_privatekey(file_get_contents($this->config['api_key']));
        $message =  $appId."\n". //appid
            $timeStamp."\n".//时间戳
            $nonceStr."\n".
            $package."\n";
        //计算签名值
        openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
        $sign = base64_encode($raw_sign);
        // print_r($sign);exit;
        return $sign;
    }

    /**
     * @S: ----{--------------------------->
     * @Name: 方法: 请求报文主题
     * @Author: Fcy 
     * @return {*}
     * @Date: 2022-10-25 14:12:46
     * @D: ----{--------------------------->
     * @param {*} $http_method
     * @param {*} $url
     * @param {*} $body
     */    
    public function sign($http_method = 'POST',$url = '',$body = '')
    {
        $mch_private_key = openssl_get_privatekey(file_get_contents($this->config['api_key']));
        $timestamp = time();//时间戳
        $nonce = getRandChar(32);//随机串
        $url_parts = parse_url($url);
        $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));
        //构造签名串
        $message = $http_method."\n".
            $canonical_url."\n".
            $timestamp."\n".
            $nonce."\n".
            $body."\n";//报文主体
        //计算签名值
        openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
        $sign = base64_encode($raw_sign);
        //设置HTTP头
        $config = $this->config;
        $token = sprintf('WECHATPAY2-SHA256-RSA2048 mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
            $config['sp_mchid'], $nonce, $timestamp, $config['serial_no'], $sign);
        $headers = [
            'Accept: application/json',
            'User-Agent: */*',
            'Content-Type: application/json; charset=utf-8',
            'Authorization: '.$token,
        ];
        return $headers;
    }



    /**
     * @S: ----{--------------------------->
     * @Name: 方法: post
     * @Author: Fcy
     * @return {*}
     * @Date: 2022-10-25 14:10:45
     * @D: ----{--------------------------->
     * @param {*} $url
     * @param {*} $data
     * @param {*} $headers
     */    
    public function curl_post($url , $data,$headers=array())
    {

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        //设置header头
        curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
        // POST数据
        curl_setopt($ch, CURLOPT_POST, 1);
        // 把post的变量加上
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }

    /**
     * @S: ----{--------------------------->
     * @Name: 方法: get
     * @Author: Fcy
     * @return {*}
     * @Date: 2022-10-25 14:11:18
     * @D: ----{--------------------------->
     * @param {*} $url
     * @param {*} $headers
     */    
    public function curl_get($url,$headers=array())
    {
        $info = curl_init();
        curl_setopt($info,CURLOPT_RETURNTRANSFER,true);
        curl_setopt($info,CURLOPT_HEADER,0);
        curl_setopt($info,CURLOPT_NOBODY,0);
        curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($info,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($info,CURLOPT_SSL_VERIFYHOST,false);
        //设置header头
        curl_setopt($info, CURLOPT_HTTPHEADER,$headers);
        curl_setopt($info,CURLOPT_URL,$url);
        $output = curl_exec($info);
        curl_close($info);
        return $output;
    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45285275

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值