微信开发工具能否测试后端

2019-04-27 21:09:23 pharos 阅读数 6490

开发微信小程序需要前后端一起配合,前端通过微信提供的工具开发,实际页面、样式及JS代码部署在微信服务器;后端可以通过JAVA语言开发,实现具体业务逻辑并与数据库、Redis缓存、MQ等进行交互,代码部署在开发者服务器;调用微信提供的API时,后端开发关键点有两个:

一、在前端调用wx.login() 获取 临时登录凭证code之后,将code字符串发送给后端,后端通过auth.code2Session接口获取用户唯一标识 OpenID 。

为什么非要获取OpenID?因为一个微信小程序客户在此微信小程序之内,这个OpenID是唯一的,在客户登录、使用小程序的整个过程中,开发者的后端服务就是通过它来区分不同用户的。
前端的code只是临时凭证,是有时效性的,统一OpenID的用户在每次登录小程序时code不一样。

后端获取OpenID非常简单,遵循微信小程序提供的帮助文档就成,直接Get这个地址:https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code, 将appid、secret、js_code、grant_type放进去,然后解析出返回的JSON串就可以啦。
比如用SpringBoot开发,可以将getOpenId封装成一个服务方法,在登录的时候直接调用就可以啦。
代码如下:

@Override
public CodeToSessionEntity getOpenId(String code, String logUniqueFlag) {
    String requestUrl = mallConstant.getWx_getopenid_url();
    String appId = mallConstant.getWx_appid();
    String secret = mallConstant.getWx_appSecret();
    String getUrlPath = requestUrl + "?" + "appid=" + appId + "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
    try {
        sessionEntity = restTemplate.getForObject(getUrlPath, CodeToSessionEntity.class);
    } catch (Exception e) {
        log.error("{}-根据code从微信小程序获取OpenId的值发起请求,出现了异常!e={}", logUniqueFlag, e);
    }
    log.info("{}-根据code从微信小程序获取OpenId的值发起请求,url={},result={}", logUniqueFlag, getUrlPath, sessionEntity.toString());
    return sessionEntity;
}

调用处代码如下:

CodeToSessionEntity sessionEntity = weiXinService.getOpenId(code, mtmWxCodeReq.getLogUniqueFlag());

二、后端业务逻辑如果打算调用微信提供的活体认证(生物认证)、物流助手、大数据分析能力,那么就需要access_token,这个access_token是调用这些api的接口调用凭证。

比如说调用生物认证能力,必须得有access_token。
在这里插入图片描述
获取access_token比获取OpenID还要简单,只要Get这个地址:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET, 将appid、secret放进去,然后解析出返回的JSON串就成。

“模拟大量微信小程序用户对平台进行并发访问的性能测试指引”请参考
https://blog.csdn.net/pharos/article/details/89397826

2020-01-06 15:39:12 zwb19940216 阅读数 141141
  1. 前言
    现在微信小程序越来越火了,相信不少人都通过各种途径学习过微信小程序或者尝试开发,作者就是曾经由于兴趣了解开发过微信小程序,最终自己的毕业设计也是开发一个微信小程序。所以现在用这篇博客记录我之前开发的一些经验和一些心得吧。

  2. 主要内容
    springboot后端架构构建
    小程序项目构建
    小程序api调用
    后台resetful接口编写
    小程序调用后台接口
    免费的https申请
    linux下部署上线

  3. 微信小程序项目构建
    这些基础的东西我就不过多介绍,大家在刚开始开发的时候一般都没有自己的服务器及域名,所以大家在本地编写的时候,在“详细”下的“项目设置”里面将“不校验域名安全性”勾选。这里写图片描述
    至于微信小程序的组件,即前端页面的开发希望大家耐住寂寞认真在微信开发平台上,组件https://developers.weixin.qq.com/miniprogram/dev/component/及api:https://developers.weixin.qq.com/miniprogram/dev/api/

  4. 后端详解
    我在后端编写主要是用java,当然对其他开发语言熟悉的也可以使用其他语言开发后端。现在我就java编写后端api的讲解。主要框架springboot,开发工具myeclipse,服务器阿里云服务器。
    创建一个maven项目,导入相关依赖:
    pom.xml依赖

    <!-- 统一版本控制 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
	</parent>
	<dependencies>
		<!-- freemarker渲染页面 -->
		<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-freemarker -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>

		<!-- spring boot 核心 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<!-- springboot整合jsp -->
		<!-- tomcat 的支持. -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
					<groupId>org.springframework.boot</groupId>
					<artifactId>spring-boot-starter-tomcat</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
		</dependency>
	</dependencies>

在配置文件src/main/resources/下创建application.properties文件可以修改一些配置参数等。

#jsp支持
spring.mvc.view.suffix=.jsp
spring.mvc.view.prefix=/WEB-INF/jsp/
#this is set port
#server.port=80
server.port=443
#添加ssl证书
#ssl证书文件名
server.ssl.key-store=classpath:xxxxxxx.pfx
server.ssl.key-store-password=xxxxxxxx
server.ssl.keyStoreType=xxxxxxxx

在实际项目中可能涉及数据库,还要整合mybatis,在文章中,我仅仅做测试就不做使用数据库的测试。
首先创建springboot的入口程序:app.class下面贴上代码:

@ComponentScan(basePackages= "com.bin")//添加扫包@ComponentScan(basePackages= "")
@EnableAutoConfiguration
public class App{

	//启动springboot
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
}

启动项目时直接右击run即可。
在写一个测试的controller进行微信小程序与java后端实现通信,controller代码如下:

@RestController
@SpringBootApplication
public class ControllerText {
	
	@RequestMapping("getUser")
	public Map<String, Object> getUser(){
		System.out.println("微信小程序正在调用。。。");
		Map<String, Object> map = new HashMap<String, Object>();
		List<String> list = new ArrayList<String>();
 		list.add("zhangsan");
 		list.add("lisi");
 		list.add("wanger");
 		list.add("mazi");
 		map.put("list",list);
		System.out.println("微信小程序调用完成。。。");
		return map;
	}
	
	@RequestMapping("getWord")
	public Map<String, Object> getText(String word){
		Map<String, Object> map = new HashMap<String, Object>();
		String message = "我能力有限,不要为难我";
		if ("后来".equals(word)) {
			message="正在热映的后来的我们是刘若英的处女作。";
		}else if("微信小程序".equals(word)){
			message= "想获取更多微信小程序相关知识,请更多的阅读微信官方文档,还有其他更多微信开发相关的内容,学无止境。";
		}else if("西安工业大学".equals(word)){
			message="西安工业大学(Xi'an Technological University)简称”西安工大“,位于世界历史名城古都西安,是中国西北地区唯一一所以兵工为特色,以工为主,理、文、经、管、法协调发展的教学研究型大学。原中华人民共和国兵器工业部直属的七所本科院校之一(“兵工七子”),陕西省重点建设的高水平教学研究型大学、陕西省人民政府与中国兵器工业集团、国防科技工业局共建高校、教育部“卓越工程师教育培养计划”试点高校、陕西省大学生创新能力培养综合改革试点学校。国家二级保密资格单位,是一所以\"军民结合,寓军于民\"的国防科研高校。";
		}
		map.put("message", message);
		return map;
	}
	
	@RequestMapping("")
	public String getText(){
		return "hello world";
	}


}

至此简易的后端框架及测试基本完成。
说明:@RestController与@Controller注解的区别@RestController相当于两个注解,它能实现将后端得到的数据在前端页面(网页)中以json串的形式传递。而微信小程序与后台之间的数据传递就是以json报文的形式传递。所以这就是选择springboot框架开发小程序后端的主要原因之一。可以方面我们进行小程序的后端开发。

  1. 小程序发起网络请求
    在完成了小程序的后端开发,下面进行小程序端发起网络请求。
    下面以一个简单的按钮请求数据为例:
    wxml文件
<button bindtap='houduanButton1'>点击发起请求</button>
<view wx:for="{{list}}">
    姓名:{{item}}
  </view>
js文件
 /**
   * 页面的初始数据
   */
  data: {
    list: '',
    word: '',
    message:''

  },
  houduanButton1: function () {
    var that = this;
    wx.request({
      url: 'http://localhost:443/getUser',
      method: 'GET',
      header: {
        'content-type': 'application/json' // 默认值
      },
      success: function (res) {
        console.log(res.data)//打印到控制台
        var list = res.data.list;
        if (list == null) {
          var toastText = '数据获取失败';
          wx.showToast({
            title: toastText,
            icon: '',
            duration: 2000
          });
        } else {
          that.setData({
            list: list
          })
        }
      }
    })
  }

主要调用的api就是wx.request,想知道将详细的介绍大家可以去微信公众平台
接下来以搜索类型的请求为例:
wxml文件:

 <input type="text" class="houduanTab_input" placeholder="请输入你要查询的内容" bindinput='houduanTab_input'></input>
  <button bindtap='houduanButton2'>查询</button>
  <view wx:if="{{message!=''}}">
    {{message}}
  </view>

js文件:变量的定义见上一个js文件

//获取输入框的内容
  houduanTab_input: function (e) {
    this.setData({
      word: e.detail.value
    })
  },
  // houduanButton2的网络请求
  houduanButton2: function () {
    var that = this;
    wx.request({
      url: 'http://localhost:443/getWord',
      data:{
        word: that.data.word
      },
      method: 'GET',
      header: {
        'content-type': 'application/json' // 默认值
      },
      success: function (res) {
        console.log(res.data)//打印到控制台
        var message = res.data.message;
        if (message == null) {
          var toastText = '数据获取失败';
          wx.showToast({
            title: toastText,
            icon: '',
            duration: 2000
          });
        } else {
          that.setData({
            message: message
          })
        }
      }
    })
  }

至此已经完成了简易的微信小程序端与java后端进行通信。
现在可以在启动后端项目在微信开发工具上进行测试。
演示效果:
这里写图片描述
这里写图片描述
所以至此已经完成了小程序的前后端通信。

  1. https申请
    其实也不算什么申请,在购买域名之后可以申请免费的ssl证书,在前面的配置文件application.properties中有证书的配置,将证书的pfx文件直接添加到后端项目下即可。
  2. 购买服务器部署后端api代码
    对于springboot项目,本人建议打jar,直接在服务器上部署即可,在服务器上只需要安装对应版本的jdk即可。项目部署命令:
    我购买的是阿里云的轻量级应用服务器部署的。比较划算吧。
运行命令: nohup java -jar helloworld.jar &

nohup的意思不挂服务,常驻的意思,除非云服务器重启,那就没法了;最后一个&表示执行命令后要生成日志文件nohup.out。
当然还可以使用java -jar helloworld.jar

源码:链接: https://pan.baidu.com/s/1PfByFfEgqkVALcc3PRhn9w 提取码: c7yf

结束语:由于时间篇幅问题,本人介绍的内容很有限,希望对这方面有兴趣的你能有帮助。共同进步。
觉得有帮助,给个赞赏吧。给赞赏的优先同意qq或者微信,问问题秒回复等[滑稽],谢谢老铁。
在这里插入图片描述

2016-09-06 16:07:59 chen517611641 阅读数 4738

##准备工作
1.ngrok,微信的接口有一些是被动的接收从微信服务器发送的消息的,所以需要提供一个域名给微信服务器,ngrok可以将本机的指定端口,映射到一个域名。花生壳什么的也可以。
2.微信web开发者工具,微信官方的调试工具
##测试账号配置
###测试账号信息
在测试账号管理界面,你可以获取到AppID和APPSecret。
###接口配置信息
这里写图片描述

验证URL有效性成功后即接入生效,成为开发者。如果公众号类型为服务号(订阅号只能使用普通消息接口),可以在公众平台网站中申请认证,认证成功的服务号将获得众多接口权限,以满足开发者需求。

此后用户每次向公众号发送消息、或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等。

下面的文档描述了这个接口的作用:
http://mp.weixin.qq.com/wiki/8/f9a0b8382e0b77d87b3bcc1ce6fbc104.html
###JS接口安全域名
这里写图片描述
配置在ngrok生成的域名,配置这个配置项的目的是让开发者可以在该域名下调用微信开放的JS接口。
JS-SDK相关的内容可以看这里:
http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html
###测试账号二维码
这里写图片描述
用测试账号扫一下这个二维码,就能关注这个测试账号了,回复信息什么的就可以测试了。
###体验接口权限列表
这里写图片描述
测试账号默认大部分接口都是默认开启的,有几个需要手动开启。
这里需要注意的是网页授权获取用户基本信息这个。
这里写图片描述
如上所示,这里需要配置一个域名,网页授权成功回调的时候,必须是这个域名下的地址才行,不然就报scope参数错误或没有scope权限的错误。
至此,开发环境就搭建好了,可以按照微信公众平台开发文档里的微信网页开发部分写一个网页授权获取基本信息的demo了。

2017-01-14 10:35:56 manyouzhijian 阅读数 68127

用到的工具和技术.

1.微信web开发工具小程序版

2.Myeclipse 2014

3.WebSocket

4.Maven 3.3.9

5.Tomcat 7

步骤

   1.安装配置Maven,使用Myeclipse创建web project 使用Maven项目结构. 具体步骤:点击打开链接

   2.打开微信web开发工具,由于是内部开发测试,故不要填写 appID, 创建新项目,把项目放在Maven项目目录下  src/main/webapp/项目名

   3.创建Websocket 实现握手通信.

以下代码均来自网络资料.

java服务器端:

 

package websocketTest;

import java.io.IOException;
import java.util.concurrent.CopyOnWriteArraySet;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;

/**
 * @ServerEndpoint 注解是一个类层次的注解,它的功能主要是将目前的类定义成一个websocket服务器端,
 * 注解的值将被用于监听用户连接的终端访问URL地址,客户端可以通过这个URL来连接到WebSocket服务器端
 */
@ServerEndpoint("/websocket")
public class TestWebSocket {
    //静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;

    //concurrent包的线程安全Set,用来存放每个客户端对应的MyWebSocket对象。若要实现服务端与单一客户端通信的话,可以使用Map来存放,其中Key可以为用户标识
    private static CopyOnWriteArraySet<TestWebSocket> webSocketSet = new CopyOnWriteArraySet<TestWebSocket>();

    //与某个客户端的连接会话,需要通过它来给客户端发送数据
    private Session session;

    /**
     * 连接建立成功调用的方法
     * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
     */
    @OnOpen
    public void onOpen(Session session){
        this.session = session;
        webSocketSet.add(this);     //加入set中
        addOnlineCount();           //在线数加1
        System.out.println("有新连接加入!当前在线人数为" + getOnlineCount());
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(){
        webSocketSet.remove(this);  //从set中删除
        subOnlineCount();           //在线数减1
        System.out.println("有一连接关闭!当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     * @param session 可选的参数
     */
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
        //群发消息
        for(TestWebSocket item: webSocketSet){
            try {
                item.sendMessage(message);
            } catch (IOException e) {
                e.printStackTrace();
                continue;
            }
        }
    }

    /**
     * 发生错误时调用
     * @param session
     * @param error
     */
    @OnError
    public void onError(Session session, Throwable error){
        System.out.println("发生错误");
        error.printStackTrace();
    }

    /**
     * 这个方法与上面几个方法不一样。没有用注解,是根据自己需要添加的方法。
     * @param message
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException{
        this.session.getBasicRemote().sendText(message);
        //this.session.getAsyncRemote().sendText(message);
    }

    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        TestWebSocket.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        TestWebSocket.onlineCount--;
    }
}
微信小程序客户端:
  
var app = getApp()
Page({
  onLoad:function(){

    wx.connectSocket({
      url: "ws://localhost:8080/TestYMG/websocket",
    })
    wx.onSocketOpen(function() {
      console.log('WebSocket连接已经打开!')
    wx.sendSocketMessage({
      data: 'HELLO,WORLD'+Math.random()*0XFFFFFF.toString()
    })
    });
   wx.onSocketMessage(function(data) {
     console.log(data);
   });
     //监听是否关闭
   wx.onSocketClose(function() {
     console.log('WebSocket连接已经关闭!')
   });
  },
    //手动关闭连接
  setclose:function(e){
    console.log('WebSocket连接正在关闭!')
    wx.closeSocket();

  }

  
})


2019-02-23 13:57:12 nanshenjiang 阅读数 3954

  最近在学习微信小程序,而与后端通信是小程序非常重要的一个方面,而微信小程序开发版中是不可以直接识别外网生成的api接口的,所以我们需要用到一些渗透工具,这里特来记录一下。

 

  微信小程序使用wx.request(OBJECT)来调用后端接口(作为一个后端人员,还是要学习一些前端知识的。。):

wx.request({
  url: 'test.php', // 仅为示例,并非真实的接口地址
  data: {
    x: '',
    y: ''
  },
  header: {
    'content-type': 'application/json' // 默认值
  },
  success(res) {
    console.log(res.data)
  }
})

  这与ajax相类似。其中涉及的参数我们可以通过查看微信小程序开发文档相关内容得知。其中url就是我们要设置的接口地址,虽然我们直接设置localhost:8080/xxx调用是可以的,但是如果我们使用不同网段进行相互访问就会受到阻碍,因为小程序是规定了不可以直接访问后台的接口的,要访问已经注册的域名地址才行,这与web应用是不一样的。我们可以查看该相关说明

 

  为了可以直接访问本机的api接口,我们要使用内网渗透来实现。想要了解内网穿透就要先清除ip地址和内网ip的概念,ip地址是为了给网络上每个固定的主机分配一个固定的逻辑地址而设立的一种统一的地址格式,而由于32位的ip地址已经不够用了,所以提供了nat技术,我们使用一个统一的对外的ip地址与外面网络进行联系,而内部网络我们就使用内部网关技术分配ip地址,这样子内部网络互相访问的时候我们就会使用内部ip进行通信。

  而内网渗透就是要通过代理来实现,所谓代理就是服务端不知道客户端是谁,如果要访问该客户端,就要通过代理服务器来实现的。因为自己电脑是内网地址,如果要通过外网访问该内网ip的话,则需要通过代理服务器来实现。

  这就是内网渗透,如果需要更为详细的解释可以访问:博客:一分钟实现内网穿透

 

  接下来就是说一下内网渗透工具ngrok来实现ip地址域名化外发,以实现微信小程序去访问。

  我们首先先进行下载:https://ngrok.com/download

  下载下来是个压缩包,解压就是一个工具ngrok.exe:

 

  我们直接双击打开,然后回到官网,我们要先注册获得Authtoken,才可以使用该程序,而注册我建议直接使用github关联即可,因为ngrok服务器在外国,所以在国内注册一直有问题。

  登录成功后,可以获得Authtoken:

  authtoken已经被我屏蔽了,每个人都不一样,我们打开程序,输入:

ngrok authtoken yourauthtoken

  然后由于我们是调试http接口8080的,所以在输入:

ngrok http 8080

 就可以看到代理域名后:

 我们访问http://flaxx477.ngrok.io替代原本localhost:8080来实现api接口的接入,这时候我们就可以在外网访问内网,那样子我们手机不用与电脑在同一网段(即手机用4g,电脑连wifi)也可以进行测试。

 

  另外,要在微信小程序开发工具中设置: