微信开发新浪云注意些什么

2017-01-07 22:10:00 weixin_30770495 阅读数 53

前一段时间,写了一篇在新浪云上搭建自己的网站的教程,通过简单构建了一个 maven 的项目,展示部署的整个流程,具体的操作可以参看这里

新浪云服务器除了可以搭建自己的网站以外,也非常的适合作为微信公众号回调地址来使用(熟悉微信公众号开发的朋友可能已经了解了,如果不太清楚请参看微信公众平台),微信公众号的开发需要一个公网可以访问的服务器,用于处理消息的 token 的验证,以及自身业务的定制开发。在这里,写了一些简单操作的例子,给大家参考。

准备

开发微信公众号首先要申请自己的公众号,或者获得相关需要开发的公众号的操作权限,如何申请,这里就不具体讲了,具体的流程大家可以参看微信公众号的申请流程,需要注意的是自己的 AppID 和自己的AppSecret ,不要泄漏,还需要自己设置一个 token 令牌,这里还有一个消息的加密密钥EncodingAESKey ,可以随机生成,用于消息的加密解密。如下图所示:

这里 URL 填写在新浪云申请的服务器的地址,当然具体指向到那个 path 我们需要自己去写一个 servlet,这里我自己定义了一个 WX 的 servlet,令牌我自己定义了一个,消息加密密钥使用了系统随机生成的,为了便于开发,所以消息加密方式,使用了明文的方式,这样消息就可以直观的看到,在填写完这些配置之后,在提交之后,微信的服务器会发一个 get 请求到我们填写的 URL 地址,去验证下 token,所以这里我们就预先要将这个 servlet 写好,简单的验证一步 token(代码会在下面列出),当验证通过后,修改才会成功,点击启用后,微信的服务器才会将客户端的消息,发送到我们提供的服务器。这里有具体的 接入指南

我在我的项目中建立了一个叫 WX 的 servlet。添加了如下的代码。

 

 

 

以上就是使用新浪云大概搭建一个微信处理的后端程序,简单的实现了一些文本信息的交互功能,以后有时间继续写点其他消息的交互过程。

转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/6260497.html

2016-07-14 15:08:20 wc0077 阅读数 2580

近期突然对微信公众号开发有点感兴趣,参考了CSDN博客,我便开始搭建java web项目,发布项目需要主机,在网上搜索了一番,因为只是临时测试使用,免费的原因选择了新浪云应用,结果发现各种坑


开发工具:Eclipse Java EE IDE for Web Developers.  Mars Release (4.5.0)

1. 创建Maven项目 选择webapp类型 过程略过,如果不懂maven,自行补习maven知识

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ljg</groupId>
  <artifactId>weixin_server</artifactId>
  <packaging>war</packaging>
  <version>0.0.1-SNAPSHOT</version>
  <name>weixin_server Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>weixin_server</finalName>
  </build>
</project>

上面就是普通的maven web项目的pom,无任何特别之处

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>CrazyServlet</servlet-name>
    <servlet-class>  
            com.ljg.weixin.servlet.CrazyServlet 
        </servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>CrazyServlet</servlet-name>
    <url-pattern>/Javen</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

新建servlet
package com.ljg.weixin.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ljg.weixin.util.SignUtil;

/**
 * 核心请求处理类 
 * @author 简爱微萌
 * @Email zyw205@gmail.com
 * 
 */
public class CrazyServlet extends HttpServlet {

    private static final long serialVersionUID = -5021188348833856475L;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 微信加密签名  
        String signature = request.getParameter("signature");  
        // 时间戳  
        String timestamp = request.getParameter("timestamp");  
        // 随机数  
        String nonce = request.getParameter("nonce");  
        // 随机字符串  
        String echostr = request.getParameter("echostr");  
        PrintWriter out = response.getWriter();  
        // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败  
        if (SignUtil.checkSignature(signature, timestamp, nonce)) {  
            out.print(echostr);  
        }  
        out.close();
        out = null;
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO 消息的接收、处理、响应  
    }
}
签名工具类

package com.ljg.weixin.util;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 请求校验工具类
 * 
 * @author 简爱微萌
 * @Email zyw205@gmial.com
 * 
 */
public class SignUtil {
    // 与接口配置信息中的Token要一致
    private static String token = "Javen";

    /**
     * 验证签名
     * 
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp,
            String nonce) {
        String[] arr = new String[] { token, timestamp, nonce };
        // 将token、timestamp、nonce三个参数进行字典序排序
        //Arrays.sort(arr);
        sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;

        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三个参数字符串拼接成一个字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        System.out.println(tmpStr); 
        content = null;
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }

    /**
     * 将字节数组转换为十六进制字符串
     * 
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }

    /**
     * 将字节转换为十六进制字符串
     * 
     * @param mByte
     * @return
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
                'B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];

        String s = new String(tempArr);
        return s;
    }

    public static void sort(String a[]) {
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = i + 1; j < a.length; j++) {
                if (a[j].compareTo(a[i]) < 0) {
                    String temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
    }
    
    public static void main(String[] args) {
		boolean checkSignature = checkSignature("3EA0FC1149E97F47A2FE9FEB5E79E308F4ED864A", "1393224944", "1392553418");
		System.out.println(checkSignature);
	}
}
加servlet必须的jar包 javax.servlet-api-3.1.0.jar,我用的是这个,是仿照新浪云项目的入门例子:https://github.com/sinacloud/java-getting-started

打包成war,上传。

这时要把javax.servlet-api-3.1.0.jar去掉!!!如果不小心忘记去掉了,那么后果是这样的:



去掉之后,上传再访问: http://1.xxxx.applinzi.com/Javen?signature=3EA0FC1149E97F47A2FE9FEB5E79E308F4ED864A&echostr=helloworld&timestamp=1393224944&nonce=1392553418(xxxx是新浪云web应用名称)

页面显示

helloworld

5、微信测试。
此步暂时还没做

2017-12-01 19:37:26 qq_31650731 阅读数 324

新浪云服务商提为用户提供了云应用平台SAE,其中新注册的用户可以获得一定程度的免费使用额度,利用该平台可以搭建微信公众号测试号服务器,可以初学公众号的小伙伴们练练手。

1.SAE创建应用

首先打开新浪云,用微博帐号登录,进入用户中心,首次进入之后会送200的“云豆”,用户服务器维护消耗,如果实名认证会赠送300的“云豆”,当然不认证这些豆也够测试用了,只是在网页上会有一个提示。

点击用户中心上方的控制台,选择云应用SAE,进入应用平台,点击下方创建新应用


出现一个弹窗,点击继续创建,对应配置选择如下:


选好配置和填好对应的二级域名和应用,点击右侧创建应用,之后跳转到代码管理页面,显示应用的详细信息,注意下方的Git仓库信息和Git代码部署说明待会用用到


2.git部署微信服务器

2.1下载示例代码

打开微信公众号开发者文档-接入指南https://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html,下载PHP示例代码到本地解压后名称为wx_sample.php,我们要做的就是把wx_sample部署到服务器上


2.2建立本地git仓库

在桌面(或其他位置)新建一个文件夹作为本地git仓库,这里命名为wxtestwx_sample.ph放入该文件夹。

使用命令行进入该文件夹,依次使用如下命令git init初始化wxtest仓库,里面会多出一个隐藏的.git文件。

为了检验效果,可以用代码编辑器打开wx_sample.php文件,加上输出echo“显示成功”,当然也可以不这么做,显示不报错就行。

2.3 添加远程仓库并部署代码

根据网页上的分别执行命令行,注意add后面有个空格再跟一个圆点


打开浏览器输入网址http://1.XXX.applinzi.com/wx_sample.php,其中XXX为应用名称;或者在新浪云SAE平台,点击下方对应的应用,进入应用主页,点击左侧应用,下拉展开点击代码管理,在代码页面点击表格里的链接,浏览器打开会报错,需要在后面加上应用名称/wx_sample.php,进入网页,正常的话不会报错。

我这里在wx_sample.php里面加上了echo输出,所以会显示一个显示成功。


这样微信服务器示例代码部署成功。

2.4配置测试号接口信息

打开微信公众平台接口测试帐号申请网址https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login用手机微信扫一扫登录公众平台测试帐号系统

进入页面会显示你的测试号信息,包括appIDappsecret,我们需要填写下方的接口配置信息才算完整的搭建好服务器。

URL填写你刚才访问wx_sample的页面,即http://1.XXX.applinzi.com/wx_sample.php

Token填写,打开本地wx_sample.php,找到//define your token下面一行代码,里面默认的是wexin就是默认的Token,你也可以改成自己的,但是填写在接口配置信息上的token要和你上传的wx_sample.php代码上一致


填写好URLToken后,点击下方提交按钮,第一次点击可能会提示配置失败,再点击一次就会提示配置成功。

若还是无法配置成功,确认http://1.XXX.applinzi.com/wx_sample.php能正常访问、URLToken填写无误、wx_sample.php代码无错误后,请打开本地wx_sample.php文件,在图示位置加上代码header('content-type:text');

然后重复步骤再次提交到新浪云远程应用仓库


配置成功后,一个微信测试号的服务器算是搭建完整,下一篇分享一下在电脑端如何获取用户信息及移动端用户授权等功能的实现

2016-03-16 15:19:00 u014427391 阅读数 13603



Sina App Engine(以下简称SAE)是新浪研发中心于2009年8月开始内部开发,并在2009年11月3日正式推出第一个Alpha版本的国内首个公有云计算平台,SAE是新浪云计算战略的核心组成部分。

 

我们先申请一个账号:直接访问http://sae.sina.com.cn

 

注册成功后,我们就可以进入管理系统

选择创建SAE

这里选择PHP的,也可以选用其它语言哦

 

 

创建成功后,我们可以看见两个版本控制系统哦,因为我比较熟悉SVN,所以就下载了TortoiseSVN

提供下载官网和网盘:

官网:http://tortoisesvn.net/downloads.html

网盘:http://www.kuaipan.cn/file/id_8825968814858609.html

 

注意要创建一个版本号哦

然后选择上传代码包,提供微信接口代码

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

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

class wechatCallbackapiTest
{
	public function valid()
    {
        $echoStr = $_GET["echostr"];

        //valid signature , option
        if($this->checkSignature()){
        	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)){
                
              	$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()
	{
        $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;
		}
	}
}

?>

注意要采用专业的软件,设置编码为UTF-8,同时压缩为zip的文件,才可以上传哦,不用使用记事本哦

上传成功的话,点击编辑代码,是可以看到我们的代码的哦

 

 

打开那个链接:可以看到我们搭建的网页哦

 

 

 

2018-01-11 16:03:36 u010483897 阅读数 2986

今天把之前开发的公众号代码从新浪云服务器转移到阿里云服务器了,期间在配置微信公众号的url时遇到一些问题,耽误了一些时间,下面简要介绍一下。

之前在新浪云服务器,按照官方提供的一些开发配置文档,很轻松的就配置成功了,具体方法可参考链接:http://blog.csdn.net/u010483897/article/details/78051785

今天放到阿里云服务器上,代码原封不动,想着应该只是配置需要修改一下,其实也就只有微信服务器的URL地址需要变动一下而已,代码是没必要修改的。其中,main.py的代码展示如下,因为后面介绍的会跟这部分代码有关:

import web
from handle import Handle

urls = ('/wx', 'Handle',)

if __name__ == '__main__':
    app = web.application(urls, globals())
    app.run()
其中的handle.py文件里面有一个Handle类,用来处理GET和POST请求。

但是我按照最初的思维,修改了一下url为:http://X.X.X.X/weChat(其中X.X.X.X为我阿里云服务器的ip地址,weChat是我的项目在阿里云服务器上面的文件夹名称),然后运行阿里云服务器上的代码:python main.py

显示如下:

注意上面图片中最下面一行:http://0.0.0.0:8080/,可以看出,阿里云服务器默认监听的是8080端口,但是公众号发送的消息是发送到80端口的,所以此处阿里云服务器是收不到公众号服务器发送来的消息的。最开始,我查了好多文章,大都是说的好复杂啊,甚至使用Nginx将80端口的消息映射到8080端口的,但是我还是采取了最笨的也是最简单的方法,即启动程序时设定端口:python main.py 80。此时,启动页面如下:

已经可以监听80端口了。

之后点击微信公众号配置提交按钮,却显示:Token验证失败,同时阿里云服务器显示如下:


可以看出,明显的微信公众号后台发来的请求,没有根据填写的URL找到相应的内容。又修改URL为:http://X.X.X.X/weChat/wx,还是不行。明明main.py函数里面已经把wx映射到Handle类里面了,觉得应该可以运行GET函数,返回Token了,但是的的确确是找不到这些内容。

后来,多次修改URL和main.py函数,终于成功了。修改方法是:修改main.py函数的:

urls = ('/weChat', 'Handle',)

之后,运行python main.py 80,修改微信配置界面的URL为:http://X.X.X.X/weChat,然后提交,终于成功通过Token验证了。这个原因,应该就是url地址了,其实说实话根本原因我也不是很懂,可能是因为main.py文件所在的文件夹为weChat,所以访问他的URL链接应该这样写,同时main.py文件里的urls也应该这样配置吧。

具体针对网上有很多别的方法配置的,我觉得都好难。