微信小店服务端的JAVA实现

2014-08-14 19:01陈甫
电脑知识与技术 2014年19期

陈甫

摘要:介绍了微信小店接口功能、服务端结构及微信小店接口开发的一般过程,并使用JAVA语言实现了微信小店服务端HTTPS传输、JSON数据生成和分析、获取ACCESS_TOKEN以及微信小店接口调用等主要环节。

关键词:微信小店;接口开发;JAVA;JSON;HTTPS

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)19-4442-04

The Implementation of Wechat Shop Server by Java

CHEN Fu

(South West Air Traffic Management Bureau.CAAC,Chengdu 610202,China)

Abstract:This paper presents a brief introduction to the interface functions and server structures of Wechat shop and the general process of its interface development. Using JAVA, it implements major sectors of Wechat shop server HTTPS transmission, JSON data generation and analysis, ACCESS_TOKEN acquisition, and Wechat shop interface, etc.

Key words: Wechat shop;interface development;JAVA;JSON;HTTPS

微信小店自微信公众平台推出后,成为又一种网络营销方式。微信小店提供了丰富的接口可供运营小店,而JAVA在移植性方面的优势很适合在多种平台上部署由其开发的微信小店服务端。该文介绍了微信小店服务端结构,以及使用JAVA语言实现微信小店服务端的主要环节。

1 微信小店简介

微信小店是基于微信支付的一套通过公众号售卖商品的解决方案,包括开店、商品上架、商品管理、订单管理、货架管理、维权等多种功能,开通微信小店后,就可以进行小店的开启、运营和使用[1,2]。运营者可直接通过微信小店的各个功能运营微信小店。与微信公众号开发模式一样,微信小店也为具备开发能力的运营者提供了实现各种功能的接口,便于运营者结合自身已有的运营资源,建立微信小店服务端以管理和使用微信小店的各种功能,为顾客提供灵活细致的服务,提高顾客体验。

2 微信小店服务端结构

微信公众平台为运营者建立微信小店服务端提供了丰富的接口。通过在微信小店服务端调用这些接口,可以运营微信小店。图1是根据文献[2]绘制的微信小店接口图。从图1可见微信小店接口涉及微信小店的多个方面。微信小店服务端调用微信小店接口的大致过程如图2所示,据此,微信小店服务端结构和模块的层次关系如图3所示。在微信小店服务端结构中,微信小店服务端根据自己的业务逻辑生成相应的JSON数据提交给微信小店接口,并将微信小店接口返回的JSON数据进行分析和引入微信小店服务端业务逻辑中,JSON数据生成和分析模块是微信小店服务端中业务逻辑与微信小店交互的关键。

3 微信小店服务端的实现

3.1 HTTPS传输

微信小店接口都通过HTTPS方式访问。大多数时候HTTPS请求主要是POST方法,提交的内容主要是JSON数据,在上传图片时提交的内容是图片的数据;仅在访问获取所有商品信息、所有邮费模板信息、所有分组信息和所有货架信息等不需要复杂参数的接口时才使用GET方法。HTTPS传输模块的主要代码如下:

1)使用指定的信任管理器(MyX509TrustManager)创建HTTPS连接。

TrustManager[] tm = { new MyX509TrustManager() };

SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");

sslContext.init(null, tm, new java.security.SecureRandom());

SSLSocketFactory ssf = sslContext.getSocketFactory();

URL url = new URL(requestUrl);

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();

conn.setSSLSocketFactory(ssf);

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setUseCaches(false);

conn.setRequestMethod(requestMethod); //请求方式(GET/POST)

2)向输出流写数据。其中的outBytes为字节数组,可以来自于数据库大字段、本地图片和字符串。当将字符串转化为outBytes时需要使用UTF-8编码(与微信接口相关的编码一般都是UTF-8编码)。

if (null != outBytes) {

OutputStream outputStream = conn.getOutputStream();

outputStream.write(outBytes);endprint

outputStream.close();

}

3)从输入流读取返回内容,并将返回内容转化为JSON格式。

InputStream inputStream = conn.getInputStream();

InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");

BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

String str = null;

StringBuffer buffer = new StringBuffer();

while ((str = bufferedReader.readLine()) != null) {

buffer.append(str);

}

jsonObject = JSONObject.fromObject(buffer.toString());

3.2 JSON数据生成

大多数接口都需要向微信小店接口提交JSON数据,这些数据实际上是访问微信小店接口的参数。腾讯严格定义了所有微信小店接口传入的JSON数据格式和内容。

以生成增加分组的JSON数据为例。增加分组的JSON数据包括分组名称group_name、商品列表product_list。商品列表包含该新增组包含的商品ID(商品ID可以通过访问微信小店查询商品接口获取)。生成和获取JSON数据需要引入json-lib的jar包。需要定义GroupDetail和GroupDetailObject两个类,主要代码为:

public class GroupDetail {

private String group_name;

private List product_list;

…… // group_name和product_list的set和get方法略

}

public class GroupDetailObject {

private GroupDetail group_detail;

…… // group_detail的set和get方法略

}

生成JSON数据的代码主要为:

List list=new ArrayList();

list.add("pDF3iY9cEWyMimNlKbik_NYJTzYU");

list.add("pDF3iY4kpZagQfwJ_LVQBaOC-LsM");

GroupDetail groupdetail=new GroupDetail();

groupdetail.setGroup_name("测试分组");

groupdetail.setProduct_list(list);

GroupDetailObject groupdetailobject=new GroupDetailObject();

groupdetailobject.setGroup_detail(groupdetail);

String jsonString = JSONObject.fromObject(groupdetailobject).toString();

生成的JSON数据将与来自文献[2]中增加分组的数据示例相同:

{

"group_detail" : {

"group_name": "测试分组",

"product_list" : [

"pDF3iY9cEWyMimNlKbik_NYJTzYU",

"pDF3iY4kpZagQfwJ_LVQBaOC-LsM"

] } }

3.3 获取ACCESS_TOKEN

微信小店所有接口的调用都需要ACCESS_TOKEN值。ACCESS_TOKEN是通过微信公众平台的ACCESS_TOKEN接口获取,该接口需要用到微信公众号的APPID和APPSECRET。ACCESS_TOKEN增加了微信小店接口调用的安全性。获取ACCESS_TOKEN的主要代码为:

String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";

token_url = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);

JSONObject jsonObject = httpsRequest(token_url, "GET", null);

其中,token_url为ACCESS_TOKEN接口;jsonObject为返回的JSON数据。使用jsonObject.getString("access_token")取得ACCESS_TOKEN值,ACCESS_TOKEN值的有效期可以通过jsonObject.getInt("expires_in")取得。获取ACCESS_TOKEN的详细代码可以参照文献[3-5]。