最近公司需要做一款通过公众号获取幸运码抽奖的程序
跟微信公众号对接肯定得去看公众号开发文档,我花了几分钟大致了阅览了一下,满足发送关键词然后获取抽奖码功能无需申请任何权限,所有公众号都拥有的这个权限,如果有更多的权限那支持更多功能的拓展了,我们用了高级接口开发的,这是简化后的分享教程,支持所有订阅号服务号
先大致捋一下步骤
公众号服务器配置->接收用户信息->生成抽奖码->写入数据库

所需食材:
首先你得有一个微信公众号,还有一台闲置的服务器。
没有服务器也没关系,可以找图图提供测试地址
登录微信公众号(订阅号、服务号都支持)
在左边功能菜单栏依次点击【开发】->【基本配置】

2.开通IP白名单
在IP白名单处设置IP白名单,把服务器的IP和本机的调试IP粘贴上去,一行一个
确定之后就开始配置公众号服务器

OK之后直接把代码拿过去用就行了,已经封装好了,导入数据库,只需把数据库连接信息改一下就可了
index.php
<?php
header('content-type:text/html;charset=utf-8');
define("TOKEN", "pamtest");
$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {$wechatObj->responseMsg();}else{$wechatObj->valid();}
class wechatCallbackapiTest
{
public function valid()
{
$echoStr = $_GET["echostr"];
if ($this->checkSignature()) {
echo $echoStr;
exit;
}
}
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
return true;
} else {
return false;
}
}
public function responseMsg()
{
$postStr = $GLOBALS["HTTPS_RAW_POST_DATA"];
if (!empty($postStr)) {
$postObj = simplexml_load_string($postStr, 'SimpleXMLlement', LIBXML_NOCDATA);
$RX_TYPE = trim($postObj->MsgType);
switch ($RX_TYPE) {
case "text":
$result = $this->receiveText($postObj);
break;
default:
$result = "unknow msg type: " . $RX_TYPE;
break;
}
echo $result;
} else {
echo "";
exit;
}
}
private function receiveText($object)
{
if ($object->Content == "抽奖") {
include "conn.php";
$getuserid = mysqli_fetch_assoc(mysqli_query($link_mysql, "select wxid,luckyid from activities_1 where wxid='$object->FromUserName'"));
if ($getuserid["wxid"] == $object->FromUserName) {
$content = "您的幸运号码是:【" . $getuserid["luckyid"] . "】";
$result = $this->transmitText($object, $content);
return $result;
} else {
$luckyid = rand(1000, 9999);
$getluckyid = mysqli_fetch_assoc(mysqli_query($link_mysql, "select luckyid from activities_1 where luckyid='$luckyid'"));
if ($getluckyid["id"] == $luckyid) {
$content = "获取失败,请重新获取一次";
$result = $this->transmitText($object, $content);
return $result;
} else {
$setuser = mysqli_query($link_mysql, "INSERT INTO activities_1 VALUES (null,'$object->FromUserName','$luckyid',now());");
if ($setuser == 1) {
$content = "您的幸运号码是:【" . $luckyid . "】";
$result = $this->transmitText($object, $content);
return $result;
}
else
{
$content = "服务器繁忙,请稍后重试";
$result = $this->transmitText($object, $content);
return $result;
}
}
}
}
}
private function transmitText($object, $content)
{
$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
$result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
return $result;
}
}
conn.php
<?php
//数据库链接
$link_mysql_array = array("dizhi"=>"localhost","user"=>"test123456","password"=>"test123456","base"=>"test123456");
$link_mysql = mysqli_connect($link_mysql_array["dizhi"],$link_mysql_array["user"],$link_mysql_array["password"],$link_mysql_array["base"]);
if(!$link_mysql)
{
echo("数据库链接失败:".mysqli_connect_error());
}
?>
activities_1.sql
CREATE TABLE `activities_1` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`wxid` varchar(255) DEFAULT NULL COMMENT '微信用户唯一ID',
`luckyid` varchar(255) DEFAULT NULL COMMENT '抽奖码',
`stime` varchar(255) DEFAULT NULL COMMENT '操作时间',
PRIMARY KEY (`Id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='cj';
都配置完之后我们到公众号测试下效果

成功取到抽奖码

用户能正常获取抽奖码,我们后台也取到了,然后就是需要一个抽奖前端
在网上随便找了个源码微改,换个背景图就是一个简单的抽奖程序了...

这也是针对于线下活动抽奖设计的一个程序
支持二开,改成线上抽奖或者其他任何自定义功能都可以,非常方便!
条件允许的情况下可以写个后台方便管理....
未完待续......(2020-12-21)
文档参考
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
| 参数 | 描述 |
|---|
| ToUserName | 开发者微信号 |
| FromUserName | 发送方帐号(一个OpenID) |
| CreateTime | 消息创建时间 (整型) |
| MsgType | 消息类型,文本为text |
| Content | 文本消息内容 |
| MsgId | 消息id,64位整型 |
公众平台接口域名说明
开发者可以根据自己的服务器部署情况,选择最佳的接入域名(延时更低,稳定性更高)。除此之外,可以将其他接入域名用作容灾用途,当网络链路发生故障时,可以考虑选择备用域名来接入。请开发者使用域名进行API接口请求,不要使用IP作为访问。若有需要开通网络策略,开发者可以从获取微信服务器IP地址定期获取最新的IP信息。
-
通用域名(api.weixin.qq.com),使用该域名将访问官方指定就近的接入点;
-
通用异地容灾域名(api2.weixin.qq.com),当上述域名不可访问时可改访问此域名;
-
上海域名(sh.api.weixin.qq.com),使用该域名将访问上海的接入点;
-
深圳域名(sz.api.weixin.qq.com),使用该域名将访问深圳的接入点;
-
香港域名(hk.api.weixin.qq.com),使用该域名将访问香港的接入点。