陳甫
摘要:介紹了微信小店接口功能、服務(wù)端結(jié)構(gòu)及微信小店接口開發(fā)的一般過程,并使用JAVA語言實現(xiàn)了微信小店服務(wù)端HTTPS傳輸、JSON數(shù)據(jù)生成和分析、獲取ACCESS_TOKEN以及微信小店接口調(diào)用等主要環(huán)節(jié)。
關(guān)鍵詞:微信小店;接口開發(fā);JAVA;JSON;HTTPS
中圖分類號:TP311 文獻(xiàn)標(biāo)識碼: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
微信小店自微信公眾平臺推出后,成為又一種網(wǎng)絡(luò)營銷方式。微信小店提供了豐富的接口可供運(yùn)營小店,而JAVA在移植性方面的優(yōu)勢很適合在多種平臺上部署由其開發(fā)的微信小店服務(wù)端。該文介紹了微信小店服務(wù)端結(jié)構(gòu),以及使用JAVA語言實現(xiàn)微信小店服務(wù)端的主要環(huán)節(jié)。
1 微信小店簡介
微信小店是基于微信支付的一套通過公眾號售賣商品的解決方案,包括開店、商品上架、商品管理、訂單管理、貨架管理、維權(quán)等多種功能,開通微信小店后,就可以進(jìn)行小店的開啟、運(yùn)營和使用[1,2]。運(yùn)營者可直接通過微信小店的各個功能運(yùn)營微信小店。與微信公眾號開發(fā)模式一樣,微信小店也為具備開發(fā)能力的運(yùn)營者提供了實現(xiàn)各種功能的接口,便于運(yùn)營者結(jié)合自身已有的運(yùn)營資源,建立微信小店服務(wù)端以管理和使用微信小店的各種功能,為顧客提供靈活細(xì)致的服務(wù),提高顧客體驗。
2 微信小店服務(wù)端結(jié)構(gòu)
微信公眾平臺為運(yùn)營者建立微信小店服務(wù)端提供了豐富的接口。通過在微信小店服務(wù)端調(diào)用這些接口,可以運(yùn)營微信小店。圖1是根據(jù)文獻(xiàn)[2]繪制的微信小店接口圖。從圖1可見微信小店接口涉及微信小店的多個方面。微信小店服務(wù)端調(diào)用微信小店接口的大致過程如圖2所示,據(jù)此,微信小店服務(wù)端結(jié)構(gòu)和模塊的層次關(guān)系如圖3所示。在微信小店服務(wù)端結(jié)構(gòu)中,微信小店服務(wù)端根據(jù)自己的業(yè)務(wù)邏輯生成相應(yīng)的JSON數(shù)據(jù)提交給微信小店接口,并將微信小店接口返回的JSON數(shù)據(jù)進(jìn)行分析和引入微信小店服務(wù)端業(yè)務(wù)邏輯中,JSON數(shù)據(jù)生成和分析模塊是微信小店服務(wù)端中業(yè)務(wù)邏輯與微信小店交互的關(guān)鍵。
3 微信小店服務(wù)端的實現(xiàn)
3.1 HTTPS傳輸
微信小店接口都通過HTTPS方式訪問。大多數(shù)時候HTTPS請求主要是POST方法,提交的內(nèi)容主要是JSON數(shù)據(jù),在上傳圖片時提交的內(nèi)容是圖片的數(shù)據(jù);僅在訪問獲取所有商品信息、所有郵費模板信息、所有分組信息和所有貨架信息等不需要復(fù)雜參數(shù)的接口時才使用GET方法。HTTPS傳輸模塊的主要代碼如下:
1)使用指定的信任管理器(MyX509TrustManager)創(chuàng)建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)向輸出流寫數(shù)據(jù)。其中的outBytes為字節(jié)數(shù)組,可以來自于數(shù)據(jù)庫大字段、本地圖片和字符串。當(dāng)將字符串轉(zhuǎn)化為outBytes時需要使用UTF-8編碼(與微信接口相關(guān)的編碼一般都是UTF-8編碼)。
if (null != outBytes) {
OutputStream outputStream = conn.getOutputStream();
outputStream.write(outBytes);endprint
outputStream.close();
}
3)從輸入流讀取返回內(nèi)容,并將返回內(nèi)容轉(zhuǎn)化為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數(shù)據(jù)生成
大多數(shù)接口都需要向微信小店接口提交JSON數(shù)據(jù),這些數(shù)據(jù)實際上是訪問微信小店接口的參數(shù)。騰訊嚴(yán)格定義了所有微信小店接口傳入的JSON數(shù)據(jù)格式和內(nèi)容。
以生成增加分組的JSON數(shù)據(jù)為例。增加分組的JSON數(shù)據(jù)包括分組名稱group_name、商品列表product_list。商品列表包含該新增組包含的商品ID(商品ID可以通過訪問微信小店查詢商品接口獲?。?。生成和獲取JSON數(shù)據(jù)需要引入json-lib的jar包。需要定義GroupDetail和GroupDetailObject兩個類,主要代碼為:
public class GroupDetail {
private String group_name;
private List
…… // group_name和product_list的set和get方法略
}
public class GroupDetailObject {
private GroupDetail group_detail;
…… // group_detail的set和get方法略
}
生成JSON數(shù)據(jù)的代碼主要為:
List
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數(shù)據(jù)將與來自文獻(xiàn)[2]中增加分組的數(shù)據(jù)示例相同:
{
"group_detail" : {
"group_name": "測試分組",
"product_list" : [
"pDF3iY9cEWyMimNlKbik_NYJTzYU",
"pDF3iY4kpZagQfwJ_LVQBaOC-LsM"
] } }
3.3 獲取ACCESS_TOKEN
微信小店所有接口的調(diào)用都需要ACCESS_TOKEN值。ACCESS_TOKEN是通過微信公眾平臺的ACCESS_TOKEN接口獲取,該接口需要用到微信公眾號的APPID和APPSECRET。ACCESS_TOKEN增加了微信小店接口調(diào)用的安全性。獲取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數(shù)據(jù)。使用jsonObject.getString("access_token")取得ACCESS_TOKEN值,ACCESS_TOKEN值的有效期可以通過jsonObject.getInt("expires_in")取得。獲取ACCESS_TOKEN的詳細(xì)代碼可以參照文獻(xiàn)[3-5]。