如果你有这样的需求,需要为用户或者自己开发一个微信公众号,当有用户关注该公众号,或者发消息时,我们的系统可以自动处理,并进行回复,还需要把其中一些信息推送到我们的pb客户端。
这个功能如何用pb实现?
配置微信公众号
进入微信公众平台测试,可以进行相关公众平台的测试开发。只需要 设置两个地方就可以,比较简单,不多说。不过有个坑比较大,坑了我好久,用红字标记。
注意:1. 必须填写域名 2.url不能太短
PB开发和运行
当用户关注或者发消息时,微信平台会调用前面配置的url地址进行通知,所以需要用PB开发一个服务后台,这个不是pb的强项,不过借助satrda组件可以很容易这个功能。satrda提供了服务端,类似tomcat等应用服务器,可以支持PB开发的pbl,pbd,dll部署到服务器上运行。satrda组件可以到QQ群:345559891下载
下载完成解压后,
1.打开server\plugins\config.cfg插件配置文件进行配置(建议使用用notepad++打开),打开后翻到最后名称为wx的项,效果如下:
其中Dir代表pb程序所在的目录,wxdemo代表目录在插件所在目录的wxdemo下面。
URL是当前插件需要响应的网址,这里和我们在微信平台配置的url一致。细心的朋友看到这里其实不一致,是/wx/**,而微信平台是https://www.mywx.com/wx/push这样的,这个url其实是/wx/**的一个子集,代表可以响应https://www.mywx.com/wx/push,同样也可以响应https://www.mywx.com/wx/msg等等。
task代表插件后台的定时任务,"period":0表示在插件加载时执行一次,"period":30 每隔30秒执行一次。这个应用场景可以很多,大家自己想:)
DLL代表pb运行库,示例是9.0,其它版本请填入实际的值,这个dll需要放在satserver.exe的相同目录或者系统目录下面能够找到,当然如果没有安装pb环境,pb程序运行时依赖的其它dll还是需要一块包括
其它参数请参考下载demo里的文档,这里不进行改动,关掉。
2.打开示例的pb工程,找到n_wx对象,修改appid,appsecret,token为微信平台中设置的值
保存后,将plugin.pbl拷到server\plugins\wxdemo目录。
3.将server目录拷备到服务器,配置运行端口为80端口并运行(参考文档,这里要保证服务器的80端口不能被其它程序占用,微信公众平台http只能用80端口)
4.打开微信关注测试订阅号,到这里不出错就可以看到效果了。
5.运行pb示例看推送示例,点击推送演示进入推送窗口,server填上服务器域名或者ip,主题填上wxmsg,当公众号收到消息时就会发送到客户端,效果如图:
主要代码说明
打开示例的pb工程,找到satrda_service 如下:
代码判断了当task2任务,即启动时,先去取微信accesstoken,如果不取accesstoken,回复会发生错误。
of_getaccesstoken()代码如下:
//得到访问token
String ls_url,ls_null,ls_json
long ll_rtn,ll_http,ll_buffer,ll_data
string ls_token,ls_expire
long ll_time
//从缓存取出accesstoken,如果存在并且没有过期,则直接返回
ls_token = n_api.of_memcacheget("wx","access_token")
n_api.of_writeLog(n_api.log_debug,"get memcache token:" + ls_token)
if ls_token <> "" then
ls_expire = n_api.of_memcacheget("wx","expires_in")
n_api.of_writeLog(n_api.log_debug,"get memcache expire:" + ls_expire)
ll_time = n_api.satrda_unixtime( )
if long(ls_expire) >= ll_time then
return ls_token
end if
end if
ls_url = weixinHost + "/token?grant_type=client_credential&appid=" + appid + "&secret=" + appsecret
ll_http = n_api.SATHTTP_Create()
ll_rtn = n_api.SATHTTP_Get(ll_http, ls_url)
if ll_rtn <> 200 then
n_api.of_writeLog(n_api.log_debug,"Https Get token error:" + string(ll_rtn))
return ""
end if
ll_buffer = n_api.SATHTTP_GetBuffer(ll_http)
//String以0结尾,插入1个0
n_api.Buffer_Append(ll_buffer,n_api.StringToPtr(ls_null),1)
ll_data = n_api.Buffer_Data(ll_buffer)
ls_json = n_api.of_utf8tostring( ll_data)
n_api.of_writeLog(n_api.log_debug,ls_json)
n_api.SATHTTP_Destroy(ll_http)
//正常得到token,写入缓存
ls_token = of_getmidstr( ls_json, '"access_token":"','","')
ls_expire = of_getmidstr( ls_json, '"expires_in":','}')
ll_time = n_api.satrda_unixtime( ) + long(ls_expire)
if ls_token <> "" then
n_api.of_writeLog(n_api.log_debug,"write to memcache access_token:" + ls_token)
n_api.memcacheset( "wx","access_token", ls_token)
n_api.memcacheset( "wx","expires_in", string(ll_time))
end if
return ls_token
注意:token需要通过api保存在memcache中,不能是全局变量。因为每次调用可能是相同的也可能是不同的pb应用,全局变量不能通用。
主要处理在n_wx的of_service中,可以打开看主要代码
微信公众号还包括很多功能,示例演示了主要功能,其它功能可以根据微信的官方文档自己进行添加。突然发现可以使用的场景有好多,发挥大家智慧的时候到了:)
公众号演示
手机扫描二维码,关注订阅号,可以看到上面开发的效果