微信提現(xiàn)到用戶零錢

需求背景:微信提現(xiàn)到用戶的零錢
官方文檔:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_1

<?php

/**
 * 功能說明:微信退款(企業(yè)付款到零錢)
 */
class WxRefund
{
    //應(yīng)用appid
    public $pay_appid = '';
    //商戶id
    public $pay_mchid = '';
    //商戶密鑰
    public $pay_mchkey = '';

    public function __construct()
    {
        $this->pay_appid = config('WEIXINPAY.APPID');
        $this->pay_mchid = config('WEIXINPAY.PAYMCHID');
        $this->pay_mchkey = config('WEIXINPAY.PAYMCHKEY');
    }

    /**
     *  作用:生成簽名
     */
    private function getSign($Parameters)
    {
        //簽名步驟一:按字典序排序參數(shù)
        ksort($Parameters);
        $buff = "";
        foreach ($Parameters as $k => $v) {
            $buff .= $k . "=" . $v . "&";
        }
        $String = '';
        if (strlen($buff) > 0) {
            $String = substr($buff, 0, strlen($buff) - 1);
        }
        //簽名步驟二:在string后加入KEY
        $String = $String . "&key=" . $this->pay_mchkey;
        //簽名步驟三:MD5加密
        $String = md5($String);
        //簽名步驟四:所有字符轉(zhuǎn)為大寫
        $result_ = strtoupper($String);
        return $result_;
    }

    /**
     *  作用:array轉(zhuǎn)xml
     */
    private function arrayToXml($arr)
    {
        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
        }
        $xml .= "</xml>";
        return $xml;
    }

    /**
     *   xml轉(zhuǎn)換為數(shù)組
     */
    public function xmlToArray($xml)
    {
        //禁止引用外部xml實(shí)體
        libxml_disable_entity_loader(true);
        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        $val = json_decode(json_encode($xmlstring), true);
        return $val;
    }

    /**
     *  作用:以post方式提交xml到對(duì)應(yīng)的接口url
     */
    private function postXmlCurl($xml, $url)
    {
        $ch = curl_init();                                      //初始化curl
        curl_setopt($ch, CURLOPT_URL, $url);                 //抓取指定網(wǎng)頁
        curl_setopt($ch, CURLOPT_HEADER, 0);                    //設(shè)置header
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            //要求結(jié)果為字符串且輸出到屏幕上
        curl_setopt($ch, CURLOPT_POST, 1);                      //post提交方式
        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);           // 增加 HTTP Header(頭)里的字段
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);        // 終止從服務(wù)端進(jìn)行驗(yàn)證
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

         //(3)API證書安全

        // 1.證書文件不能放在web服務(wù)器虛擬目錄吓著,應(yīng)放在有訪問權(quán)限控制的目錄中鲤嫡,防止被他人下載;
        // 2.建議將證書文件名改為復(fù)雜且不容易猜測(cè)的文件名绑莺;
        // 3.商戶服務(wù)器要做好病毒和木馬防護(hù)工作暖眼,不被非法侵入者竊取證書文件。
        $zs1 =  "證書文件夾/weixin/********.pem"; // 證書地址
        $zs2 =  "證書文件夾/weixin/******.pem"; // 證書地址

        curl_setopt($ch, CURLOPT_SSLCERT, $zs1);
        curl_setopt($ch, CURLOPT_SSLKEY, $zs2);

        $data = curl_exec($ch);                                 //運(yùn)行curl

        if (curl_errno($ch)) {
            echo 'Errno:' . curl_error($ch);
        }
        curl_close($ch);
        return $data;
    }

    /**
     * 產(chǎn)生隨機(jī)字符串纺裁,不長(zhǎng)于32位
     *
     * @param int $length
     * @return 產(chǎn)生的隨機(jī)字符串
     */
    public 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;
    }

    /**
     * 企業(yè)付款到零錢
     * @param string $partner_trade_no  商戶訂單號(hào)
     * @param float  $amount  發(fā)送的金額(分)
     * @param string $re_openid  收款人的 openid
     * @param string $desc 企業(yè)付款描述信息 (必填)
     * @param string $check_name 收款用戶姓名 (選填)
     * @return [type]    [description]  這里沒有使用姓名強(qiáng)校驗(yàn)
     */
    public function sendMoney($partner_trade_no, $amount, $re_openid, $desc = '測(cè)試', $check_name = '')
    {
        $data = array(
            'mch_appid' => $this->pay_appid,// 商戶賬號(hào)appid
            'mchid' => $this->pay_mchid,// 商戶號(hào)
            'nonce_str' => $this->getNonceStr(),// 隨機(jī)字符串
            'partner_trade_no' => $partner_trade_no,// 商戶訂單號(hào)
            'openid' => $re_openid,// 用戶openid
            'check_name' => 'NO_CHECK',// 校驗(yàn)用戶姓名選項(xiàng), NO_CHECK:不校驗(yàn)真實(shí)姓名 FORCE_CHECK:強(qiáng)校驗(yàn)真實(shí)姓名
            // 're_user_name' => $check_name,// 收款用戶姓名
            'amount' => $amount * 100,// 金額
            'desc' => $desc,// 企業(yè)付款描述信息
            // 'spbill_create_ip'=> IP,// Ip地址
        );

        //生成簽名算法
        $data['sign'] = $this->getSign($data);

        $xml = $this->arrayToXml($data);
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'; // 調(diào)用接口
        $res = $this->postXmlCurl($xml, $url);
        $return = $this->xmlToArray($res);
        if($return['return_code'] == 'SUCCESS' && $return['result_code'] == 'SUCCESS' && $return['err_code'] == 'SUCCESS'){
            return array('status'=>1,'payment_no'=>$return['payment_no']);
        }else{
            return array('status'=>0,'message'=>$return['err_code_des']);
        }
    }



}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诫肠,一起剝皮案震驚了整個(gè)濱河市司澎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栋豫,老刑警劉巖挤安,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異丧鸯,居然都是意外死亡蛤铜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門丛肢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來围肥,“玉大人,你說我怎么就攤上這事蜂怎∧驴蹋” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵杠步,是天一觀的道長(zhǎng)氢伟。 經(jīng)常有香客問我,道長(zhǎng)幽歼,這世上最難降的妖魔是什么腐芍? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮试躏,結(jié)果婚禮上猪勇,老公的妹妹穿的比我還像新娘。我一直安慰自己颠蕴,他們只是感情好泣刹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著犀被,像睡著了一般椅您。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上寡键,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天掀泳,我揣著相機(jī)與錄音,去河邊找鬼西轩。 笑死员舵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的藕畔。 我是一名探鬼主播马僻,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼注服!你這毒婦竟也來了韭邓?” 一聲冷哼從身側(cè)響起措近,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎女淑,沒想到半個(gè)月后瞭郑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸭你,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年凰浮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苇本。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡姊途,死狀恐怖萧落,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤陕截,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布果元,位于F島的核電站丹喻,受9級(jí)特大地震影響椒惨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜劝贸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一姨谷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧映九,春花似錦梦湘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至引有,卻和暖如春瓣颅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背譬正。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工宫补, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人曾我。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓粉怕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親您单。 傳聞我的和親對(duì)象是個(gè)殘疾皇子斋荞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容