tp6/thinkphp6框架如何接入微信提现零钱功能

微信APP支付提现功能是我们常用的一个功能,接下来我们来对接APP的微信提现

业务范围
1.各类APP的提现功能为用户创造提现收益等

微信支付流程

1.选择接入模式 (商户平台申请)成为普通商户
2.参数申请 开放平台申请APPID ,商户号平台申请mchid
3.绑定APPID及mchid
4.配置API key API v3密钥主要用于平台证书解密、回调信息解密,具体使用方式可参见接口规则文档中证书和回调报文解密章节。请根据以下步骤配置API key:登录
微信商户平台,进入【账户中心 > API安全 > API安全】目录,点击【APIV3密钥】。
5.下载并配置商户证书,商户可登录微信商户平台,在【账户中心】->【API安全】->【API证书】目录下载证书
6.生成证书串
7. 详情可见 APP支付接入准备

tp6框架接入微信提现功能

你好!有很多人在接入微信支付时无从下下手,那么在本篇文件,带你详细的了解并实现微信支付,废话不多说,咱们开始

官方文档(多观察文档,和现成的代码就会发现微信支付的套路其实并不难)

微信支付官方文档

配置

  //微信 支付配置
    'Wxpay_config' => array (
        'appid' => '',  //微信开放平台上的应用id
        'secret' => '',  //微信开放平台上的应用secret
        'mch_id' => '',  //微信申请成功之后邮件中的商户id
        'api_key' => '',  //商户秘钥在微信商户平台上自己设定的api密钥 32位
        'notify_url' => '', //支付回调地址
        'huiyuan_notify' => ''  //会员支付回调地址
    ),```

微信 控制器文件
//在进行请求时必须需要使用证书:cert 与 key 分别属于两个.pem文件
    private $SSLCERT_PATH = "/data/wxpay/apiclient_cert.pem"; //微信证书
    private $SSLKEY_PATH =  "/data/wxpay/apiclient_key.pem"; //商品规格
	
	/*
	* 微信提现转付款到零钱
	* @access public
	* @param  string  $openid 微信用户openid
	* @param  string  $trade_no 订单号
	* @param  int     $money 金额
	* $param  string  $desc 付款备注	
	*/ 
    public function wxtransfer($openid,$trade_no,$money,$desc)
    {
        $data = [
            'mch_appid'         => config('app.Wxpay_config.appid'),
            'mchid'             => config('app.Wxpay_config.mch_id'),
            'nonce_str'         => $this->createNoncestr(),
            'partner_trade_no'  => $trade_no,
            'openid'            => $openid,
            'check_name'        => 'NO_CHECK',
            'amount'            => $money,
            'desc'              => $desc,
            'spbill_create_ip'  => $this->get_client_ip(),
        ];//请求参数拼凑
        $data['sign'] = $this->getSign($data);//sign进行签名
        $xmldata = $this->arrayToXml($data);//数组转为xml格式
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; //微信付款到零钱提现的地址
        $res =  $this->postXmlSSLCurl($xmldata,$url); //Curl请求
        return $res;
    }
      /*
        生成签名
     */
    function getSign($Obj)
    {
        foreach ($Obj as $k => $v)
        {
            $Parameters[strtolower($k)] = $v;
        }
        //签名步骤一:按字典序排序参数
        ksort($Parameters);
        $String = $this->formatBizQueryParaMap($Parameters, false);
        //echo "【string】 =".$String."</br>";
        //签名步骤二:在string后加入KEY 在此处替换需要更改的KEY
        $String = $String."&key=".config('app.Wxpay_config.api_key');
//        echo "<textarea style='width: 50%; height: 150px;'>$String</textarea> <br />";
        //签名步骤三:MD5加密
        $result_ = strtoupper(md5($String));
        return $result_;
    }
    //数组转xml
    function arrayToXml($arr)
    {
        $xml = "<xml>";
        foreach ($arr as $key=>$val)
        {
            if (is_numeric($val))
            {
                $xml.="<".$key.">".$val."</".$key.">";

            }
            else
                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
        }
        $xml.="</xml>";
        return $xml;
    }
  //将数组转成uri字符串
    function formatBizQueryParaMap($paraMap, $urlencode)
    {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v)
        {
            if($urlencode)
            {
                $v = urlencode($v);
            }
            $buff .= strtolower($k) . "=" . $v . "&";
        }
        $reqPar = '';
        if (strlen($buff) > 0)
        {
            $reqPar = substr($buff, 0, strlen($buff)-1);
        }
        return $reqPar;
    }
    
    //需要使用证书的请求
    private function postXmlSSLCurl($xml,$url,$second=30)
    {
        $ch = curl_init(); //初始化curl
        //设置超时时间
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        //这里设置代理,如果有的话
        //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
        //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,FALSE);
        //设置header
        curl_setopt($ch,CURLOPT_HEADER,FALSE);
        //要求结果为字符串且输出到屏幕上
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
        //设置证书
        //使用证书:cert 与 key 分别属于两个.pem文件
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT, $this->SSLCERT_PATH);
        //默认格式为PEM,可以注释
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY,$this->SSLKEY_PATH);
        //post提交方式
        curl_setopt($ch,CURLOPT_POST, true);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
        $data = curl_exec($ch);
        //返回结果
        if($data){
            curl_close($ch);
            return $data;
        }
        else {
            $error = curl_errno($ch);
            echo "curl出错,错误码:$error"."<br>";
            curl_close($ch);
            return false;
        }
    }
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的ThinkPHP 5.1版本的微信提现代码示例: ```php <?php namespace app\index\controller; use think\Controller; use think\facade\Config; use think\facade\Log; use think\facade\Request; class Withdraw extends Controller { // 微信提现接口 public function wechatWithdraw() { // 获取请求参数 $params = Request::param(); // 获取微信支付配置信息 $wxPayConfig = Config::get('wxpay'); // 请求参数构造 $data = [ 'mch_appid' => $wxPayConfig['appid'], 'mchid' => $wxPayConfig['mchid'], 'nonce_str' => md5(uniqid()), 'partner_trade_no' => $params['order_no'], 'openid' => $params['openid'], 'check_name' => 'NO_CHECK', // 不校验真实姓名 'amount' => $params['amount'], // 提现金额,单位分 'desc' => '提现描述', 'spbill_create_ip' => $_SERVER['REMOTE_ADDR'], ]; // 生成签名 $data['sign'] = $this->makeSign($data, $wxPayConfig['key']); // 数组转xml格式 $xmlData = $this->arrayToXml($data); // 发送请求 $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; $response = $this->postXmlCurl($xmlData, $url, true, 6, $wxPayConfig['sslcert_path'], $wxPayConfig['sslkey_path']); // 解析返回的xml数据 $result = $this->xmlToArray($response); // 返回结果 if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') { // 提现成功 return json(['code' => 0, 'msg' => '提现成功']); } else { // 提现失败 Log::error('微信提现失败:' . $response); return json(['code' => 1, 'msg' => '提现失败,请重试']); } } // 生成签名 private function makeSign($data, $key) { // 去除数组中的空值 $data = array_filter($data); // 按照键名的字典序排序 ksort($data); // 生成字符串 $stringA = ''; foreach ($data as $key => $value) { $stringA .= $key . '=' . $value . '&'; } $stringA .= 'key=' . $key; // 进行MD5签名并转化为大写 return strtoupper(md5($stringA)); } // 数组转xml格式 private function arrayToXml($data) { $xml = "<xml>"; foreach ($data as $key => $value) { if (is_numeric($value)) { $xml .= "<" . $key . ">" . $value . "</" . $key . ">"; } else { $xml .= "<" . $key . "><![CDATA[" . $value . "]]></" . $key . ">"; } } $xml .= "</xml>"; return $xml; } // 发送post请求xml数据 private function postXmlCurl($xmlData, $url, $useCert = false, $timeout = 30, $sslcert_path = '', $sslkey_path = '') { $ch = curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlData); if ($useCert == true) { curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); curl_setopt($ch, CURLOPT_SSLCERT, $sslcert_path); curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM'); curl_setopt($ch, CURLOPT_SSLKEY, $sslkey_path); } $data = curl_exec($ch); curl_close($ch); return $data; } // xml转数组 private function xmlToArray($xml) { // 禁止引用外部xml实体 libxml_disable_entity_loader(true); $xmlString = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $result = json_decode(json_encode($xmlString), true); return $result; } } ``` 其中,$wxPayConfig是微信支付的配置信息,可以在config目录下的wxpay.php文件中进行配置。 该示例仅供参考,实际使用时需要根据自己的业务需求进行相应的修改和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值