微信小程序發送紅包功能。填坑記錄


微信官方文檔

1.開通條件

(1)商戶號已入駐90

(2)商戶號有連續30天正常交易

(3)只有企業資質的商戶才有資格申請

2.注意事項

(1)目前小程序紅包僅支持用戶微信掃碼打開小程序

(2)小程序開通了‘社交紅包類目’或者處於違規狀態時,將無法開發小程序紅包

(3)單日最高發放金額一百萬元(可在商戶平台設置)

(4)單日每個用戶可領取紅包個數1-10(可在商戶平台設置)

(5)單日同一用戶領取本商戶紅包金額 最高一千元(可在商戶平台設置)

(6)防刷等級:防刷是指微信風控針對微信小號、僵屍號、機器號等的攔截,你可以通過更改防刷等級控制防刷的強度(0級為關閉,13逐級遞增安全等級);

(7)要選擇好紅包發放場景,

3.需要提供的信息

(1)需提供商戶證書(詳情見4.4

(2)微信支付分配的商戶號

(3)公眾賬號appid

(4)商戶名稱(發送紅包時,發送者名稱)

4.商戶后台操作

4.1 開通小程序紅包權限

在使用小程序紅包之前,請前往開通小程序紅包功能。操作路徑:【登錄微信支付商戶平台——>產品中心——>小程序紅包——>開通】

 

 

 

 

 

 

 

 

4.2 首次開通時需要選擇一個具體的小程序進行權限申請,如下圖所示:

其他需要開通權限的小程序,可在頁面自行設置。操作路徑如下:【登錄商戶平台——>產品中心——>小程序紅包——>產品設置】。(注:“產品設置”操作按鈕僅當你開通小程序紅包功能之后才會出現)

 

4.3 設置紅包具體參數【登錄商戶平台——>產品中心——>小程序紅包——>產品設置】(注:“產品設置”操作按鈕僅當你開通小程序紅包功能之后才會出現)。

 

 

4.4 下載API證書

 

 

 

 

4.5 商戶平台商戶號獲取

 

 


 

代碼踩坑記錄。

1:POST請求時需要商戶號證書的哦

2.每個號測試的時候一天一個openID只能生成10個紅包,怕測試失敗  就把生成紅包接口返回的$return['package']保存起來 生成紅包全靠他了

3.timeStamp' => time()."",  這個timeStamp必須是字符串,如果直接time(),用數字的話前端會報錯請求不成功,而且wx.sendBizRedPacket()小程序的這個接口小程序開發文檔里沒有該接口文檔,測試了下 FAIL回調方法里   不管什么錯誤   只會給你返回一個請求不成功,我就是沒細心看文檔被這個數字的時間戳搞死了  最后才發現是傳的數字....

4.urlencode($return['package'])  這個是生成簽名的時候就 urlencode 然后傳給小程序端

5.簽名的時候看好參數,和其他的接口不一樣不要按老經驗來,這里是用appId,timeStamp,nonceStr,package這4個參數生成簽名,沒有signType 這個參數,返回前端您的時候確實不需要APPID,需要SIGNTYPE.

6.這里返回前端領取紅包的簽名最后不要轉為大寫

7.wx.getLaunchOptionsSync()//獲取場景代碼   必須要用這個判斷一下頁面場景值,就是你通過什么方式進入的小程序,每個進入方法都有一個值,叫場景值.如果沒有判斷,那就是所有場景都生成紅包,,哈哈這下你會發現 紅包是生成了 可是領不了.除非你把每個package都保存起來,或者不是和我一樣直接生成待領取..要不你沖的那點錢根本不夠用...好像沒有撤回紅包方法,乖乖等24小時后退回把

8.這個是最坑的一點,為什么寫到最后,因為我也想讓您們體驗一下我的絕望.........這個紅包只在1011,1025,1047,1124這四個場景值中觸發,不用查資料弄這4個場景值是啥意思了    現在我就可以負責人的告訴你,   只能手機用攝像頭掃   不要和我一樣妄想着把圖片放朋友圈  別人長按識別就能領取了.........你想到的方法我都試過了  一維碼   二維碼    小程序碼   甚至一物一碼   都只支持用攝像頭掃,    長按和微信掃一掃在相冊里掃都不行 都不觸發...

借鑒:https://developers.weixin.qq.com/community/develop/article/doc/000c6009a5cbd805d8790d4ab56013感謝這位大哥。

/**發送紅包接口*/
  public function createredpacket(){
        $url ='https://api.mch.weixin.qq.com/mmpaymkttransfers/sendminiprogramhb';//請求生成紅包的網址
        $parameters =array(
            'nonce_str' => $this->createNoncestr(),//隨機字符串,不長於32位 這個方法就是隨機獲得32位隨機字符
            'mch_billno' => '23345807342710814',//商戶訂單號
            'mch_id' =>  $this->mch_id,//商戶ID
            'wxappid' => $this->appid ,//小程序appid,這里不用文檔的公眾號APPID,直接填你的小程序APPID就行
            'send_name' => '我是土豪',//紅包發送者名稱
            're_openid'=>'oTPLE5J3****gEMJJ-UwLCwb4',//用戶OpenId
            'total_amount'=>100,//付款金額,單位分
            'total_num'=>1,//紅包發放總人數
            'wishing' =>'祝您萬事大吉',//紅包祝福語String(128)
            'act_name' =>'測試活動',//活動名稱String(32)
            'remark'=>'恭喜你',//備注String(256)
            'notify_way' =>'MINI_PROGRAM_JSAPI',//通過JSAPI方式領取紅包,小程序紅包固定傳MINI_PROGRAM_JSAPI
            // 'scene_id'=>'PRODUCT_1',
        );
        //統一下單簽名
        $parameters['sign'] = $this->getSign($parameters);

        $xmlData = $this->arrayToXml($parameters);
        /* $res = $this->postXmlCurl($xmlData, $url, 60);*/
        $return = $this->xmlToArray($this->postXmlSSLCurl($xmlData, $url, 60));
        var_dump($return);
    }
/**收到紅包生成驗簽(這里應該是和發送紅包連着用,為了記錄,單獨拿出來 寫的驗簽)*/ 
public function shou(){
        $parameters = array(
            'appId' => $this->appid, //小程序 ID
            'timeStamp' =>  time()."", //時間戳
            'nonceStr' => $this->createNoncestr(), //隨機串
            'package' => urlencode('package'), //數據包--package是發送紅包成功后返回的,
        );
        //生成簽名
        $parameters['paySign'] = $this->getSign($parameters); //*****這里驗簽不需要轉換大寫
        return $parameters;
    }
/**查看紅包發送記錄*/
  public function get_hb(){
        $url ='https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo';//請求生成紅包的網址
        $parameters =array(
            'nonce_str' => $this->createNoncestr(),//隨機字符串,不長於32位 這個方法就是隨機獲得32位隨機字符
            'mch_billno' => '2334580734271081',//商戶訂單號
            'mch_id' =>  $this->mch_id,//商戶ID
            'appid' => $this->appid ,//小程序appid,這里不用文檔的公眾號APPID,直接填你的小程序APPID就行
            'bill_type' =>'MCHT'//通過JSAPI方式領取紅包,小程序紅包固定傳MINI_PROGRAM_JSAPI

        );
        //統一下單簽名
        $parameters['sign'] = $this->getSign($parameters);

        $xmlData = $this->arrayToXml($parameters);
        /* $res = $this->postXmlCurl($xmlData, $url, 60);*/
        $return = $this->xmlToArray($this->postXmlSSLCurl($xmlData, $url, 60));
        var_dump($return);
    }
  //作用:生成簽名
    private function getSign($Obj) {
        foreach ($Obj as $k => $v) {
            $Parameters[$k] = $v;
        }
        //簽名步驟一:按字典序排序參數
        ksort($Parameters);

        $String = $this->formatBizQueryParaMap($Parameters, false);
        //簽名步驟二:在 string 后加入 KEY
        $String = $String . "&key=" . $this->key;

        //簽名步驟三:MD5 加密
        $String = md5($String);
        //簽名步驟四:所有字符轉為大寫--根據接口需要打開限制
        $result_ = $String;
        // $result_ = strtoupper($String);
        return $result_;
    }
 //作用:產生隨機字符串,不長於 32 位
    private function createNoncestr($length = 32) {
        $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
        $str = "";
        for ($i = 0; $i < $length; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        } return $str;
    }
   /**
     * 作用:格式化參數,簽名過程需要使用
     * @param $paraMap
     * @param $urlencode
     * @return string
     */
    private function formatBizQueryParaMap($paraMap, $urlencode) {
        $buff = "";
        ksort($paraMap);
        foreach ($paraMap as $k => $v) {
            if ($urlencode) {
                $v = urlencode($v);
            }
            $buff .= $k . "=" . $v . "&";
        }
        $reqPar = "";
        if (strlen($buff) > 0) {
            $reqPar = substr($buff, 0, strlen($buff) - 1);
        }
        return $reqPar;
    }
  /**
     * 
     * 需要使用證書的請求
     * @param $xml
     * @param $url
     * @param int $second
     * @return bool|mixed
     */
    function postXmlSSLCurl($xml,$url,$second=30)
    {
        $ch = curl_init();
        //超時時間
        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, ROOT_PATH .'/cert/apiclient_cert.pem');
        //默認格式為PEM,可以注釋
        curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
        curl_setopt($ch,CURLOPT_SSLKEY, ROOT_PATH .'/cert/apiclient_key.pem');
        //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;
        }
    }
  /**
     * 數組轉換成 xml
     * @param $arr
     * @return string
     */
    private function arrayToXml($arr) {
        $xml = "<xml>";
        foreach ($arr as $key => $val) {
            if (is_array($val)) {
                $xml .= "<" . $key . ">" . arrayToXml($val) . "</" . $key . ">";
            } else {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
        }
        $xml .= "</xml>";
        return $xml;
    }


    /**
     * xml 轉換成數組
     * @param $xml
     * @return mixed
     */
    private function xmlToArray($xml) {
        //禁止引用外部 xml 實體
        libxml_disable_entity_loader(true);
        $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        $val = json_decode(json_encode($xmlstring), true);
        return $val;
    }

注:一定要看清楚代碼踩坑記錄里面的東西,代碼是PHP的,如有錯誤請留言指正。覺得有幫助也可以支持一下。

 

 

 

 

 


免責聲明!

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



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