2014-01-21 23:09:47 sunboy_2050 阅读数 16637

最近在玩微信公众账号,开发者模式需要验证,自己没有公网服务器,于是考虑通过免费的云服务器解决了

下面是通过新浪云SAE进行的微信公众平台开发者模式的验证方法。

index.wsgi

# coding: UTF-8
import sae

import os
import web

from weixinInterface import WeixinInterface
 
urls = (
	'/', 'Hello',
    '/weixin','WeixinInterface'
)
 
class Hello:
	def GET(self):
		return ("你好, Sunboy_2050")
 
app = web.application(urls, globals()).wsgifunc()
application = sae.create_wsgi_app(app)

weixinInterface.py

#coding:UTF-8

import hashlib
import web

class WeixinInterface:
    def GET(self):
        
        data = web.input()		# 获取输入参数
        signature = data.signature
        timestamp = data.timestamp
        nonce = data.nonce
        echostr = data.echostr
        
        token="sunboy_2050"				# 自己的token
        
        list=[token,timestamp,nonce]	# 字典序排序
        list.sort()
        
        sha1=hashlib.sha1()				# sha1加密算法
        map(sha1.update, list)
        hashcode=sha1.hexdigest()
        
        if hashcode == signature:		# 如果是来自微信的请求,则回复echostr
            return echostr				# print "true"

运行结果:

在浏览器输入网址: http://weixin.ithomer.net



验证微信

成为微信公众平台开发者,需要进行验证,输入URL和Token

在SAE上,已经配置了Token(sunboy_2050),URL连接为 http://weixin.ithomer.net/weixin


点击“提交”按钮,自动进行验证,验证结果如下:



搭建的微信公众账号: ithomer




参考推荐:

利用SAE搭建微信公众平台

SAE Python环境SAE官方

微信开发者接入平台微信官方


2016-03-22 14:21:14 chroming 阅读数 3214

SAE 上使用PHP搭建微信公众号后台

准备阶段

SAE准备

SAE的应用平台提供了一个语言环境。比如提供了PHP环境的应用即可运行PHP代码。当然环境中也可以放HTML和CSS,将要展示的页面命名为index.html即可。

SAE的申请略过。创建一个PHP5.6空应用,代码管理中打开git。本地文件就可以通过Git命令上传到SAE上了。具体命令SAE页面有写。
应用有个地址,记下来,需要填到微信中。

微信准备

申请微信公众号略过。在后台的开发项中修改配置。其中:

  • URL:填刚刚SAE中创建的应用地址
  • Token:自己想填什么都可以
  • EncodingAESKey:可以随机生成的加密密钥
  • 加解密方式:一开始建议明文,熟悉了之后可以使用密文模式

之后需要在SAE的应用端验证一下这个地址可用才能启用开发者模式。
参考微信官方文档:http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html ,直接把PHP示例代码下载下来,代码里的TOKEN填刚刚配置中填的,文件名修改为index.php。
接着通过Git上传到SAE中。
确定上传完成后即可点击微信后台中的启用,如果SAE上正常运行了刚刚上传的php的话就能够启用成功。

开始写后台

官方代码

刚刚下载的示例代码不仅有验证函数,还有一个用于响应公众号用户消息的函数responseMsg()。我们先试着用示例代码写一些功能。
将刚刚修改的本地index.php文件中的$wechatObj->valid();注释掉,在下面添加一行$wechatObj->responseMsg(); 再次上传修改 git commit,git push。如果代码正常上传的话你给这个公众号发消息应该都能收到回复了。

写一个获取天气的功能

通过API获取天气信息并返回

网上搜索得到一个简单的天气查询网址:http://mobile.weather.com.cn/data/sk/101340101.htmlhttp://mobile.weather.com.cn/data/sk/101340101.html ,其中101340101表示weather.com.cn使用的城市编码,所有对应编码可见参考资料2。这里我们将参考资料2的所有对应编码保存到本地weathercode.xml中。
更新:weather.com.cn的接口无法使用了。使用http://www.heweather.com代替。(先在官网申请账户,API https://api.heweather.com/x3/weather?cityid=城市ID&key=你的认证key)

此处我们选择使用cURL的方式获取网页返回,因为这种方式比较方便且SAE官方声明支持cURL(http://www.sinacloud.com/doc/sae/php/fetchurl.html?highlight=curl

根据参考资料5的示例代码可以写出获取台北天气的代码如下:

<?php
//$wt = curl_init("http://mobile.weather.com.cn/data/sk/101340101.html");
$wt = curl_init("https://api.heweather.com/x3/weather?cityid=CN101340101&key=你的认证key
curl_setopt($wt,CURLOPT_RETURNTRANSFER,1);
$weatherjson = curl_exec($wt);
curl_close($wt);
?>

要获取指定城市的天气需要读取xml。但读取xml较麻烦(见参考资料6),于是将weathercode.xml手动转换为json格式。读取文件并转换为数组的代码如下:

$jsoncontent = file_get_contents('weathercode.json');
$weatherarray = json_decode($jsoncontent);

对于获取的json由于层数太多使用PHP处理太复杂,直接使用正则表达式获取需要的内容:

<?php
preg_match("/\"now\":{.*?{.*?}.*?}.*?}/",$json,$matches);
echo $matches[0];
?>

实现功能的完整的代码部分如下:

                if(!empty( $keyword ))
                {
                    if(strpos($keyword,"天气")!==false)
                    {
                        //get weather by user input
                        $location = str_ireplace("天气", "",$keyword);
                        $jsoncontent = file_get_contents('weathercode.json');
                        $locationarray = json_decode($jsoncontent, true);
                        $locationcode = $locationarray[$location];
                        $cncode = "CN" . $locationcode;

                        //weather can't use,use heweather instead
                        //$wt = curl_init("http://mobile.weather.com.cn/data/sk/$locationcode.html");
                        $wt = curl_init("https://api.heweather.com/x3/weather?cityid=$cncode&key=你的认证key");

                        curl_setopt($wt,CURLOPT_RETURNTRANSFER,1);
                        //curl_setopt($wt,CURLOPT_REFERER,'http://mobile.weather.com.cn/');
                        $weatherjson = curl_exec($wt);
                        //the limit of word
                        //$weatherarray = json_decode($weatherjson);
                        //$weathernow = $weatherarray->{'HeWeather data service 3.0'};
                        curl_close($wt);
                        preg_match("/\"now\":({.*?{.*?}.*?}.*?})/",$weatherjson,$matches);
                        $weathernow = $matches[1];
                        $msgType = "text";
                        $contentStr = $weathernow;
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        echo $resultStr;

                    }

格式化返回的数据

返回的数据类似于:

"now":{"cond":{"code":"101","txt":"多云"},"fl":"11","hum":"46","pcpn":"0","pres":"1021","tmp":"12","vis":"10","wind":{"deg":"120","dir":"东风","sc":"3-4","spd":"11"}}

根据官方API说明,通过正则获取内容,即可获得格式化的内容。

添加对错误城市的处理

有些时候用户会输入不存在的城市天气查询,这样返回的结果比较不好看。可以加一个判断部分,在输入不存在的城市时提示检查输入:

if($locationcode) {

……

}
else {
                        $contentStr = "没有找到这个城市哦~ 请确认城市或区名。示例1: 南京天气; 示例2: 海淀天气";
                        $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                        echo $resultStr;

这样天气查询的代码就算完成了~

参考资料:

  1. 《中国天气网 天气预报API 国家气象局 根据城市名称抓取城市ID,XML格式、JSON格式、图片代码》http://www.wjxfpf.com/2015/10/69618.html
  2. 《中国天气网天气预报API接口城市代码,XML格式,数据具体到县、区级别》http://www.wjxfpf.com/2015/10/279028.html
  3. 《【荐】怎么用PHP发送HTTP请求(POST请求、GET请求)?》http://www.php-note.com/article/detail/161
  4. 《curl网站开发指南》http://www.ruanyifeng.com/blog/2011/09/curl.html
  5. 《PHP官方手册》http://php.net/manual/zh/book.curl.php
  6. 《PHP通过SimpleXML访问xml文档》http://blog.csdn.net/guoguo1980/article/details/2436318
  7. 《json_decode》http://us3.php.net/manual/zh/function.json-decode.php
  8. 《PHP创建和解析JSON数据的方法》http://www.crazyant.net/920.html
  9. 《在PHP语言中使用JSON》http://www.ruanyifeng.com/blog/2011/01/json_in_php.html
  10. 《PHP高级特性一之正则表达式用法》http://cuiqingcai.com/1186.html
2016-01-27 17:01:07 u013067629 阅读数 1484

  自己的微信公众平台开发差不多了,欢迎关注试用哦,我会不定期在那里分享技术文章!

  主要功能:

  • 输入t+中文或者英文返回对应的英中翻译
  • 输入【m】随机来首音乐听,建议在wifi下听
  • 输入【ly+你的留言内容】,来给我留言
  • 【博客地址】 http://blog.csdn.net/zwto1
  • 【查阅书籍信息】输入书籍名,便可查看相关书籍信息
  
 【翻译】
  

  
 【音乐欣赏】
  
 
 【留言】
  
 
 【书籍信息】
  
   
 
     【公众账号】:hsd_cloud
     【扫码关注】:
           
   
    所用技术:python + mysql 
          代码托管在新浪SAE上
 
  代码已经开源出来了,托管在github上,https://github.com/chaplinthink/wechat
  因为SAE云豆已经消耗完了,没有办法试用了。

   
   

2014-10-14 23:47:37 sunnyray0901 阅读数 983

闲来无聊用一堆的免费工具搭建了一个微信公众号(订阅号),后台服务采用sinaapp的sae,优点就是不要钱!

免费,python、java都有,但是java太贵,java学生党果断选择python,就当学习了。

本文写的比较粗略,只是一些自己搭建时容易出错的地方

更详细的教程请参见http://www.nilday.com/%E5%88%A9%E7%94%A8sae%E6%90%AD%E5%BB%BA%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%B9%B3%E5%8F%B0%EF%BC%88%E4%B8%80%EF%BC%89web-py%E5%AE%9E%E7%8E%B0%E7%9A%84sae-hello-world/

1 微信公众申请

官网申请就可以,一开始启用编辑模式

2 sae python测试

sinaapp建立一个简单python应用

3 微信身份验证部分

编写好服务端后,进入微信后台配置url、token

4微信被动回复

4.1格式

要注意的就是格式,包括“__”(两条下滑线)以及tab缩进,泪的教训啊。。

4.2 debug以及日志

在线编辑代码的时候,由于没有控制台,可通过sae的日志输出。


可以在代码中输出log


2015-12-29 21:49:44 zinnc 阅读数 317

1. 首先到“微信公众平台”,申请公众号,类别选择“订阅号”。

2. 申请成功后到新浪云申请一个SAE,我是用微博账号直接申请的

3. 在“控制台”->“应用管理”->“创建新应用”->“设定二次域名”->选择开发语言:PHP5.3空应用

4. 下载wx_sample.php,修改如下(亲测可用):

<?php
/**
  * wechat php test
  */

//define your token
define("TOKEN", "weixin");
$wechatObj = new wechatCallbackapiTest();

if (isset($_GET['echostr'])) {   //后加的
    $wechatObj->valid();
}else{
    $wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
	public function valid()
    {
		
        $echoStr = $_GET["echostr"];
        
        //valid signature , option
        if($this->checkSignature()){
			header('content-type:text');   //后加的
        	echo $echoStr;
        	exit;
        }
    }

    public function responseMsg()
    {
		//get post data, May be due to the different environments
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];

      	//extract post data
		if (!empty($postStr)){
                /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                   the best way is to check the validity of xml by yourself */
                libxml_disable_entity_loader(true);
              	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                $textTpl = "<xml>
							<ToUserName><![CDATA[%s]]></ToUserName>
							<FromUserName><![CDATA[%s]]></FromUserName>
							<CreateTime>%s</CreateTime>
							<MsgType><![CDATA[%s]]></MsgType>
							<Content><![CDATA[%s]]></Content>
							<FuncFlag>0</FuncFlag>
							</xml>";             
				if(!empty( $keyword ))
                {
              		$msgType = "text";
                	$contentStr = "Welcome to wechat world!";
                	$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
                	echo $resultStr;
                }else{
                	echo "Input something...";
                }

        }else {
        	echo "";
        	exit;
        }
    }
		
	private function checkSignature()
	{
        // you must define TOKEN by yourself
        if (!defined("TOKEN")) {
            throw new Exception('TOKEN is not defined!');
        }
        
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        		
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
        // use SORT_STRING rule
		sort($tmpArr, SORT_STRING);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );
		
		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
}

?>

5. 用Git部署代码:”控制台“->”代码管理“-按照“Git代码部署说明”执行。现在你在SAE上已经有了一个云应用了,它之后将负责与微信服务器的通信。

6. 回到微信公众平台->“开发”->"基本配置":设置URL,就是http://xxx.sinaapp.com/wx_sample.php (xxx是你SAE中的二级域名);设置Token,就是php代码中写的”weixin“;设置EncodingAESKey,随机生成;消息加解密方式:我选择的是兼容模式;然后提交。

7. 此时应该显示”提交成功“

8. 在微信中搜索你的公众号并添加,随意发送消息,公众号会回复:”Welcom to wechat world!"

1:先到点击打开链接

博文 来自: ljz0898

在sae上面运行微信第三方平台微擎

博文 来自: seashoreman
没有更多推荐了,返回首页