1.開通條件
(1)商戶號已入駐90日
(2)商戶號有連續30天正常交易
(3)只有企業資質的商戶才有資格申請
2.注意事項
(1)目前小程序紅包僅支持用戶微信掃碼打開小程序
(2)小程序開通了‘社交紅包類目’或者處於違規狀態時,將無法開發小程序紅包
(3)單日最高發放金額一百萬元(可在商戶平台設置)
(4)單日每個用戶可領取紅包個數1-10個(可在商戶平台設置)
(5)單日同一用戶領取本商戶紅包金額 最高一千元(可在商戶平台設置)
(6)防刷等級:防刷是指微信風控針對微信小號、僵屍號、機器號等的攔截,你可以通過更改防刷等級控制防刷的強度(0級為關閉,1到3逐級遞增安全等級);
(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的,如有錯誤請留言指正。覺得有幫助也可以支持一下。