• 微信企业付款到银行卡


    第一次做微信企业付款到银行卡,特地记录下来,因为这个功能自己用了2-3天,这中间的坑主要是再rsa加密那块。自己记录下来,供朋友参考。自己用的php开发

    第一,首先你需要开通企业的微信认证公众号平台,然后开通支付功能。这些我就不说了。自己开通。

    第二,看文档,

    第三步,发送请求接口,发送后,腾讯会给你响应。特别要说明一点的是,腾讯这个功能真不便宜,我测试时一元钱,手续费扣了我一元。最少金额是一元。

    在发送接口时有个公钥我们首先要获得,同时里面有个签名算法,公钥主要用于到时银行账号和收款人姓名加密,把这两个搞定,其他的就好整了。

    先说rsa公钥。这个公钥是我们要从微信端服务器获得。获得后保存本地服务器。然后在linux服务器上进行公钥格式转换  把PKCS#1 转 PKCS#8:

    接口地址是:https://fraud.mch.weixin.qq.com/risk/getpublickey ,请求时需要把证书带上,证书是在微信支付平台上下载。

    这谁需要携带的参数

       public function getPuyKey(){
            $this->params = [
            'mch_id'    => self::MCHID,//商户ID
            'nonce_str' => md5(time()),
            'sign_type' => 'MD5'
            ];
            //将数据发送到接口地址
            return $this->send(self::PKURL);
        }
    

      //下面是在请求时要记得携带证书,微信支付平台上下载

      public function postData($url,$postfields){
            $ch = curl_init();
            $params[CURLOPT_URL] = $url;    //请求url地址
            $params[CURLOPT_HEADER] = false; //是否返回响应头信息
            $params[CURLOPT_RETURNTRANSFER] = true; //是否将结果返回
            $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
            $params[CURLOPT_POST] = true;
            $params[CURLOPT_POSTFIELDS] = $postfields;
            $params[CURLOPT_SSL_VERIFYPEER] = false;
            $params[CURLOPT_SSL_VERIFYHOST] = false;
            //以下是证书相关代码
            $params[CURLOPT_SSLCERTTYPE] = 'PEM';
            $params[CURLOPT_SSLCERT] = dirname(getcwd()).'/pay/cert/apiclient_cert.pem';
            $params[CURLOPT_SSLKEYTYPE] = 'PEM';
            $params[CURLOPT_SSLKEY] =dirname(getcwd()).'/pay/cert/apiclient_key.pem';
    
            curl_setopt_array($ch, $params); //传入curl参数
            $content = curl_exec($ch); //执行
            curl_close($ch); //关闭连接
            return $content;
        }
    

      

     //成功返回后,会返回xml数据,转换下,里面有pub_key 就是公钥,然后进行转换并保存

    接口会返回PKCS#1格式的公钥

    openssl rsa -RSAPublicKey_in -in pcs1.pem -out  pcs8.pem 

    证书请求后再对接口进行请求

    先读取你保存的公钥

    $pubkey=file_get_contents(dirname(getcwd()).'/pay/cert/newpubkey.pem');

    //配置好参数
    $data=array(
        'partner_trade_no'    => date('YmdHis').rand(1000,9999),   //订单号
        'enc_bank_no'         => $test->publicEncrypt('xxxxx',$pubkey),//收款方银行卡号RSA加密
        'enc_true_name'       => $test->publicEncrypt('xxxxx',$pubkey),//收款方姓名RSA加密
        'bank_code'           => '1003',//收款方开户行
        'amount'              => $prices,//付款金额 默认是分,最少1元
    );
    

     

    $pay_info=$test->bankPay($data);


    //重点是rsa加密,本人就是在这里被坑了1天,一直是签名说是银行卡或收款人姓名不正确。其实是rsa加密不正确。


     /**
         * 公钥加密,银行卡号和姓名需要RSA算法加密
         * @param string $data    需要加密的字符串
         * @return null|string    加密后的字符串
         */
        public function publicEncrypt($data = '',$pubkey='')
        {
            if (!is_string($data)) {
                return null;
            }
            // 进行加密
            $r = openssl_public_encrypt($data,$encrypt_data,$pubkey,OPENSSL_PKCS1_OAEP_PADDING);
            if($r){//加密成功,返回base64编码的字符串
                return base64_encode(''.$encrypt_data);
            }else{
                return false;
            }
        }
    

      //其实如果流程熟悉了,其实也没那么难,主要是没做过,所以才会被不停的被坑,网上关于php企业微信支付这块不是很多。记录下来希望能帮到大家。



    代码放在了csdn上了。

     https://download.csdn.net/download/hanyudanei/10397844

  • 相关阅读:
    【初探Spring】------Spring IOC(二):初始化过程---简介
    《Effective java》-----读书笔记
    【初探Spring】------Spring IOC(一)
    Nuxt 项目性能优化调研
    一个 API 设计上的失误
    mpvue 初体验之改写【车标速查】
    微信小程序开发初体验
    pointer-events: none 的两个应用场景
    小议短网址系统的设计(有些时候,需要换个角度思考问题)
    关于 parseInt 的一道有意思的面试题
  • 原文地址:https://www.cnblogs.com/hanyudanei/p/9003133.html
Copyright © 2020-2023  润新知