ThinkPHP5微信現金紅包開發


控制器:

/**
 * 發放現金紅包
 */
public function payLuckyMoney()
{
    $obj2 = array();
    //appid
    $obj2['wxappid'] = config('wx_gzh.appId');
    //商戶id
    $obj2['mch_id'] = config('wx_sh.mchId');
    //組合成28位,根據官方開發文檔,可以自行設置
    $obj2['mch_billno'] = config('wx_sh.mchId') . date('YmdHis') . rand(1000, 9999);
    // 調用接口的機器IP地址
    $obj2['client_ip'] = $_SERVER['REMOTE_ADDR'];
    //接收紅包openid
    $obj2['re_openid'] = session('openid');

    /* 付款金額設置start,按照概率設置隨機發放。
     * 1-200元之間,單位分。這里設置95%概率為1-2元,5%的概率為2-10元
     */
    $n = rand(1, 100);
    if ($n <= 95) {
        $obj2['total_amount'] = rand(100, 200);
    } else {
        $obj2['total_amount'] = rand(200, 1000);
    }
    //$obj2['total_amount'] = 100;
    /* 付款金額設置end */

    // 紅包個數
    $obj2['total_num'] = 1;
    // 商戶名稱
    $obj2['send_name'] = "小門太";
    // 紅包祝福語
    $obj2['wishing'] = "恭喜發財,大吉大利";
    // 活動名稱
    $obj2['act_name'] = "小門太認證領紅包";
    // 備注
    $obj2['remark'] = "小門太紅包";

    /* 文檔中未說明以下變量,李富林博客中有。注釋起來也沒問題。不需要。
    $obj2['min_value'] = $money;
    $obj2['max_value'] = $money;
    $obj2['nick_name'] = '小門太紅包';
    */

    $url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
    $isPay = pay_lucky_money($url, $obj2);
    $res = xml_to_array($isPay);
    // 發放成功,把紅包數據插入數據庫
    if ($res['return_msg'] == '發放成功') {
        // 發放成功,進行邏輯處理
    
    } else {
        // 發放失敗,返回失敗原因
        return $res['return_msg'];
    }
}

 

 

 common.php函數(你也可以創建一個類來進行調用):

// ---- 以下是微信現金紅包的區域start ---- //

/**
 * 微信發放現金紅包核心函數,調用本函數就直接發放紅包了。
 * @param $url 現金紅包的請求地址
 * @param $obj
 * @return mixed
 */
function pay_lucky_money($url, $obj)
{
    //創建隨機字符串(32位)
    $obj['nonce_str'] = str_rand();
    //創建簽名
    $sign = get_sign($obj, false);
    //halt($sign);
    $obj['sign'] = $sign;    //將簽名傳入數組
    $postXml = array_to_xml($obj);    //將參數轉為xml格式
    //halt($postXml);
    $responseXml = curl_post_ssl($url, $postXml);    //提交請求
    //halt($responseXml);
    return $responseXml;
}

/**
 * @param $arr 生成前面的參數
 * @param $urlencode
 * @return string 返回加密后的簽名
 */
function get_sign($arr, $urlencode)
{
    $buff = "";
    //對傳進來的數組參數里面的內容按照字母順序排序,a在前面,z在最后(字典序)
    ksort($arr);
    foreach ($arr as $k => $v) {
        if (null != $v && "null" != $v && "sign" != $k) {    //簽名不要轉碼
            if ($urlencode) {
                $v = urlencode($v);
            }
            $buff .= $k . "=" . $v . "&";
        }
    }
    // 去掉末尾符號“&”,其實不用這個if,因為長度肯定大於0
    if (strlen($buff) > 0) {
        $stringA = substr($buff, 0, strlen($buff) - 1);
    }
    //簽名拼接api
    $stringSignTemp = $stringA . "&key=" . config('wx_sh.key');
    //簽名加密並大寫
    $sign = strtoupper(md5($stringSignTemp));
    return $sign;
}


//post請求網站,需要證書
function curl_post_ssl($url, $vars, $second = 30, $aHeader = array())
{
    $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文件
    //請確保您的libcurl版本是否支持雙向認證,版本高於7.20.1,相當於發curl驗證【當前文件所在目錄/cert/wxpay/】下的兩個pem證書文件。
    curl_setopt($ch, CURLOPT_SSLCERT, dirname(__FILE__) . DIRECTORY_SEPARATOR .
        'cert' . DIRECTORY_SEPARATOR . 'wxpay' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem');
    curl_setopt($ch, CURLOPT_SSLKEY, dirname(__FILE__) . DIRECTORY_SEPARATOR .
        'cert' . DIRECTORY_SEPARATOR . 'wxpay' . DIRECTORY_SEPARATOR . 'apiclient_key.pem');
    //curl_setopt($ch,CURLOPT_CAINFO,dirname(__FILE__).DIRECTORY_SEPARATOR.
    //    'cert'.DIRECTORY_SEPARATOR.'rootca.pem');    //這個不需要,因為大部分的操作系統都已經內置了rootca.pem證書了,就是常見的CA證書。
    if (count($aHeader) >= 1) {
        curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);
    }
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $vars);
    $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;
    }
}
// ---- 以下是微信現金紅包的區域end ---- //

————以上,因為我的代碼是寫在common.php下的,而common.php是在application目錄下的,所以證書放在 application/cert/wxpay/目錄之下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM