微信公众号开发--使用公众号后台进行游戏激活码

项目要发内测激活码

使用前年做的公众号相关开发来达成解放客户精力。程序改变世界的小小理想。

相关开发文档 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;
    }
//event 关注 取消关注事件回复处理
    private function eventResponHandler($xmlArray)
    {
        $ret = ‘‘;
        $contentStr=‘按钮应答还未实现‘;
        $back = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <Content><![CDATA[%s]]></Content>                    
                </xml>";
        if ($xmlArray[‘Event‘] == ‘subscribe‘) {
            $contentStr = "这是一个价值1个亿的AI演示公众号.有多厉害你跟我聊几句试试!\n还可以玩图片抽奖哦!不信你发几张图片试试";

        } elseif ($xmlArray[‘Event‘] == ‘unsubscribe‘) {
            //todo 取消订阅 为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。
        }
        elseif ($xmlArray[‘Event‘] == ‘CLICK‘ && $xmlArray[‘EventKey‘]==‘btn1‘ ) {
            // 自定义菜单官方Q群
            $path = APP_PATH .‘WeChatAnswer.xml‘;
            $answer = readXml($path);
            $contentStr = $answer[‘btn1‘];
            //\cache(‘wxuser‘, $xmlArray[‘FromUserName‘]);
        }
        elseif ($xmlArray[‘Event‘] == ‘CLICK‘ && $xmlArray[‘EventKey‘]==‘sub1‘ ) {
            // 自定义菜单 steam激活码
            $code = AccountCode::getCodeByWxuser($xmlArray[‘FromUserName‘],0);
            $answer = readXml(APP_PATH ."/WeChatAnswer.xml");
            $contentStr = sprintf($answer[‘sub1‘],$code);
        }
        elseif ($xmlArray[‘Event‘] == ‘CLICK‘ && $xmlArray[‘EventKey‘]==‘sub2‘ ) {
            // 自定义菜单 官方激活码
            $code = AccountCode::getCodeByWxuser($xmlArray[‘FromUserName‘],1);
            $answer = readXml(APP_PATH ."/WeChatAnswer.xml");
            $contentStr = sprintf($answer[‘sub2‘],$code);
        }
        elseif ($xmlArray[‘Event‘] == ‘CLICK‘ && $xmlArray[‘EventKey‘]==‘btn3‘ ) {
            //自定义礼包码菜单
            $path = APP_PATH .‘WeChatAnswer.xml‘;
            $answer = readXml($path);
            $contentStr = $answer[‘btn3‘];
        }
        else
        {
            $contentStr .= ‘ ‘ .$xmlArray[‘EventKey‘];
        }

        $ret = sprintf($back, $xmlArray[‘FromUserName‘], $xmlArray[‘ToUserName‘], time(), ‘text‘, $contentStr);
        return $ret;

    }

 再演示了一个皮一下斗图的公众号

private function imgResponHandler($xmlArray)
    {
        $ret = ‘‘;
        $back = "<xml>
                    <ToUserName><![CDATA[%s]]></ToUserName>
                    <FromUserName><![CDATA[%s]]></FromUserName>
                    <CreateTime>%s</CreateTime>
                    <MsgType><![CDATA[%s]]></MsgType>
                    <Image>
                        <MediaId><![CDATA[%s]]></MediaId>
                    </Image>                  
                </xml>";
        $imgId = $xmlArray[‘MediaId‘];
        //$imgId = 2223;
        Log::record(‘input imgId ‘ . $imgId, ‘debug‘);
        WeChatTmpZsetManger::insertImg($imgId);
        $getImgid = WeChatTmpZsetManger::getImg();
        Log::record(‘output imgId ‘ . $getImgid, ‘debug‘);
        $ret = sprintf($back, $xmlArray[‘FromUserName‘], $xmlArray[‘ToUserName‘], time(), ‘image‘, $getImgid);
        return $ret;
    }

以上就基本实现了改变世界的一小步

还是能便捷服务于大众的东西做起来更快也更有成就感