tp5實現企業支付到個人零錢支付

 /***********************企業支付到個人零錢***************************/
       /**
     * 企業支付到個人零錢
     * @param string $openid 用戶openID
     * @param string $trade_no 單號
     * @param string $money 金額
     * @param string $desc 描述
     * @return string   XML 結構的字符串
     */
    public  static function pay($openid, $trade_no, $money, $desc)
    {
          
        $data = array(
            'mch_appid' => 'wx122312',   //appid。填寫自己的
            'mchid' => '1536545',     //商戶號。填寫自己的
            'nonce_str' => self::getNonceStr(), //隨機字符串
            'partner_trade_no' => $trade_no, //商戶訂單號,需要唯一
            'openid' => $openid,
            'check_name' => 'NO_CHECK', //OPTION_CHECK不強制校驗真實姓名, FORCE_CHECK:強制 NO_CHECK:
            'amount' => $money * 100, //付款金額單位爲分
            'desc' => $desc,
            'spbill_create_ip' => '127.0.0.1',  //儘量填寫。其實影響不大
            //'re_user_name' => '隨便寫,可以忽略', //收款人用戶姓名 *選填
            //'device_info' => '1000',  //設備號 *選填
        );
 
        //生成簽名
        $data['sign'] = self::makeSign($data);

        //構造XML數據
        $xmldata = self::arrToXml($data);
        // 請求URL
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
        //發送post請求
        $res = self::curl_post_ssl($url, $xmldata);

 
    }
 
    /**
     * 隨機字符串
     * @param int $length
     * @return string
     */
    private static function getNonceStr($length = 32)
    {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }
 
    /**
     * 簽名
     * @param $data
     * @return string
     */
    private static function makeSign($data)
    {
        $key='91411103ma45wxu12391411103ma45wx';
        // 關聯排序
        ksort($data);
        // 字典排序
        $str = http_build_query($data);
        // 添加商戶密鑰
        $str .= '&key=' . $key;
        // 清理空格  非常噁心調了半天
        $str = urldecode($str);
        $str = md5($str);
        // 轉換大寫
        $result = strtoupper($str);
        return $result;
    }
 
    /**
     * 數組轉XML
     * @param $data
     * @return string
     */
    private static function arrToXml($data)
    {
        $xml = "<xml>";
        //  遍歷組合
        foreach ($data as $k=>$v){
            $xml.='<'.$k.'>'.$v.'</'.$k.'>';
        }
        $xml .= '</xml>';
        return $xml;
    }
 
    /**
     * 企業付款發起請求
     * 此函數來自:https://pay.weixin.qq.com/wiki/doc/api/download/cert.zip
     */
    public static function curl_post_ssl($url, $xmldata, $second=30,$aHeader=array()){
    
         $isdir = $_SERVER['DOCUMENT_ROOT']."/marscert/";   //獲取當前項目根目錄的路徑
        $sslcert_path = $isdir.'apiclient_cert.pem'; //pem文件路徑,商戶號裏直接下載
        $sslkey_path = $isdir. 'apiclient_key.pem'; //pem文件路徑,商戶號裏直接下載

    
    
        $ch = curl_init();
        //超時時間
        curl_setopt($ch,CURLOPT_TIMEOUT,$second);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
 
        //第一種方法,cert 與 key 分別屬於兩個.pem文件
        //默認格式爲PEM,可以註釋
        curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLCERT,$sslcert_path);

 
        if( count($aHeader) >= 1 ){
            curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
        }
 
        curl_setopt($ch,CURLOPT_POST, 1);
        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";
            curl_close($ch);
            return false;
        }
    }
    /***********************企業支付到個人零錢***************************/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章