項目要發內測激活碼
使用前年做的公眾號相關開發來達成解放客戶精力。程序改變世界的小小理想。
相關開發文檔 https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html
基本需求 我方生成一批不重復的字符串組合-激活碼.參考之前禮包碼的工作方式實現后續內容。
發放問題使用微信公眾號 自定義菜單 ->調用API 自定義消息回復按照對方微信userId返回一個對應的激活碼
效果示例

公眾號接口調試
使用開發平台接口調試工具 https://mp.weixin.qq.com/debug/
前置條件需要設置公眾號API白名單 API相關配置 取得AppId secret token等

使用獲取token調試接口拿取token
后續部分接口需要使用token來驗證身份
自定義菜單定義部分
使用自定義菜單后 公眾號后台大部分交互設置會完全托管給API

如示例的菜單定義json
{
"menu": {
"button": [
{
"type": "click",
"name": "官方Q群",
"key": "btn1",
"sub_button": [ ]
},
{
"name": "測試賬號",
"sub_button": [
{
"type": "click",
"name": "steam激活碼",
"key": "sub1",
"sub_button": [ ]
},
{
"type": "click",
"name": "官方激活碼",
"key": "sub2",
"sub_button": [ ]
}
]
},
{
"type": "click",
"name": "禮包領取",
"key": "btn3",
"sub_button": [ ]
}
]
}
}
使用create get接口修改自定義菜單 測試結果

使用API接收並恢復自定義消息
需要先查閱文檔 區分每一種消息的接收和回復格式
按照MsgType 區分具體的消息類型 然后解讀消息內容。並返回消息
//接受普通消息
public function responseMsg()
{
// $timestamp = input('get.timestamp');
// $nonce = input('get.nonce');
$ret = '';
$postStr = Request::instance()->getContent();
$xmlArrayInput = $this->parseXml($postStr);
if (isset($xmlArrayInput)) {
Log::record('Type: ' . $xmlArrayInput['MsgType'], 'debug');
switch ($xmlArrayInput['MsgType']) {
case 'event':
$ret = $this->eventResponHandler($xmlArrayInput);
break;
case 'text':
$ret = $this->txtResponHandler($xmlArrayInput);
break;
case 'image':
$ret = $this->imgResponHandler($xmlArrayInput);
break;
case 'video':
// $ret = $this->videoResponHandler($xmlArray);
$ret = $this->txtResponBack($xmlArrayInput,'您剛發的是視頻');
break;
case 'voice':
$ret = $this->voiceResponHandler($xmlArrayInput);
break;
case 'shortvideo':
// $ret = $this->shortVideoResponHandler($xmlArray);
$ret = $this->txtResponBack($xmlArrayInput, '您剛發的是小視頻');
break;
case 'link':
// $ret = $this->linkResponHandler($xmlArray);
$ret = $this->txtResponBack($xmlArrayInput, '您剛發的是鏈接');
break;
}
} else
echo '';
echo $ret;
return true;
}
1 //event 關注 取消關注事件回復處理 2 private function eventResponHandler($xmlArray) 3 { 4 $ret = ''; 5 $contentStr='按鈕應答還未實現'; 6 $back = "<xml> 7 <ToUserName><![CDATA[%s]]></ToUserName> 8 <FromUserName><![CDATA[%s]]></FromUserName> 9 <CreateTime>%s</CreateTime> 10 <MsgType><![CDATA[%s]]></MsgType> 11 <Content><![CDATA[%s]]></Content> 12 </xml>"; 13 if ($xmlArray['Event'] == 'subscribe') { 14 $contentStr = "這是一個價值1個億的AI演示公眾號.有多厲害你跟我聊幾句試試!\n還可以玩圖片抽獎哦!不信你發幾張圖片試試"; 15 16 } elseif ($xmlArray['Event'] == 'unsubscribe') { 17 //todo 取消訂閱 為保護用戶數據隱私,開發者收到用戶取消關注事件時需要刪除該用戶的所有信息。 18 } 19 elseif ($xmlArray['Event'] == 'CLICK' && $xmlArray['EventKey']=='btn1' ) { 20 // 自定義菜單官方Q群 21 $path = APP_PATH .'WeChatAnswer.xml'; 22 $answer = readXml($path); 23 $contentStr = $answer['btn1']; 24 //\cache('wxuser', $xmlArray['FromUserName']); 25 } 26 elseif ($xmlArray['Event'] == 'CLICK' && $xmlArray['EventKey']=='sub1' ) { 27 // 自定義菜單 steam激活碼 28 $code = AccountCode::getCodeByWxuser($xmlArray['FromUserName'],0); 29 $answer = readXml(APP_PATH ."/WeChatAnswer.xml"); 30 $contentStr = sprintf($answer['sub1'],$code); 31 } 32 elseif ($xmlArray['Event'] == 'CLICK' && $xmlArray['EventKey']=='sub2' ) { 33 // 自定義菜單 官方激活碼 34 $code = AccountCode::getCodeByWxuser($xmlArray['FromUserName'],1); 35 $answer = readXml(APP_PATH ."/WeChatAnswer.xml"); 36 $contentStr = sprintf($answer['sub2'],$code); 37 } 38 elseif ($xmlArray['Event'] == 'CLICK' && $xmlArray['EventKey']=='btn3' ) { 39 //自定義禮包碼菜單 40 $path = APP_PATH .'WeChatAnswer.xml'; 41 $answer = readXml($path); 42 $contentStr = $answer['btn3']; 43 } 44 else 45 { 46 $contentStr .= ' ' .$xmlArray['EventKey']; 47 } 48 49 $ret = sprintf($back, $xmlArray['FromUserName'], $xmlArray['ToUserName'], time(), 'text', $contentStr); 50 return $ret; 51 52 }
再演示了一個皮一下斗圖的公眾號
1 private function imgResponHandler($xmlArray) 2 { 3 $ret = ''; 4 $back = "<xml> 5 <ToUserName><![CDATA[%s]]></ToUserName> 6 <FromUserName><![CDATA[%s]]></FromUserName> 7 <CreateTime>%s</CreateTime> 8 <MsgType><![CDATA[%s]]></MsgType> 9 <Image> 10 <MediaId><![CDATA[%s]]></MediaId> 11 </Image> 12 </xml>"; 13 $imgId = $xmlArray['MediaId']; 14 //$imgId = 2223; 15 Log::record('input imgId ' . $imgId, 'debug'); 16 WeChatTmpZsetManger::insertImg($imgId); 17 $getImgid = WeChatTmpZsetManger::getImg(); 18 Log::record('output imgId ' . $getImgid, 'debug'); 19 $ret = sprintf($back, $xmlArray['FromUserName'], $xmlArray['ToUserName'], time(), 'image', $getImgid); 20 return $ret; 21 }
以上就基本實現了改變世界的一小步
還是能便捷服務於大眾的東西做起來更快也更有成就感
