使用微信公眾號實現掃碼開門
阿新 • • 發佈:2018-12-18
隨著新零售時代的到來,許多店鋪使用微信公眾號實現掃碼開門,下面簡單介紹。
生成店鋪URL
public void creatQrcode(String storeCode){ String url = WechatConstant.getCreatQrcodeUrl(wechatAccessTokenService.takeAccessToken()); String payResult = OkHttpUtil.getInstance().doPost(url,WechatConstant.getCreatQrcodePARAM("PAY_"+storeCode)); String inDoorResult = OkHttpUtil.getInstance().doPost(url,WechatConstant.getCreatQrcodePARAM("INDOOR_"+storeCode)); String outDoorResult = OkHttpUtil.getInstance().doPost(url,WechatConstant.getCreatQrcodePARAM("OUTDOOR_"+storeCode)); String helpResult = OkHttpUtil.getInstance().doPost(url,WechatConstant.getCreatQrcodePARAM("HELP_"+storeCode)); JSONObject payObject = JSON.parseObject(payResult); JSONObject inDoorObject = JSON.parseObject(inDoorResult); JSONObject outDoorObject = JSON.parseObject(outDoorResult); JSONObject helpObject = JSON.parseObject(helpResult); String payUrl = payObject.getString("url"); String indoorUrl = inDoorObject.getString("url"); String outdoorUrl = outDoorObject.getString("url"); String helpUrl = helpObject.getString("url"); if(!TextUtils.isEmpty(payUrl)&&!TextUtils.isEmpty(indoorUrl)&&!TextUtils.isEmpty(outdoorUrl)&&!TextUtils.isEmpty(helpUrl)){ logger.info("update store urls===storeNum="+storeCode+"==payUrl=="+payUrl +"==inDoorUrl=="+indoorUrl+"==outDoorUrl=="+outdoorUrl+"==helpUrl=="+helpUrl); augeStoreMapper.updateUrlsByCode(storeCode,payUrl,indoorUrl,outdoorUrl,helpUrl); } }
boolean isAddComplete = storeService.addStore(augeStore); if (isAddComplete) { //新增完成後,呼叫微信的相關services來更新支付,進出門以及幫助地址 try { wechatService.creatQrcode(augeStore.getCode()); } catch (Exception e) { e.printStackTrace(); } List<AugeStore> storeList = storeService.getByOrgan(admin.getOrganId()); session.setAttribute("storeList", storeList); clientResponseJSONBean = ClientResponseJSONBean.getSuccessClientResponseJSONBean(); clientResponseJSONBean.setMessage("成功"); return clientResponseJSONBean.toJSONString(); }
微信使用者掃描店鋪二維碼
注:生成的店鋪url使用草料二維碼生成二維碼圖片,以供使用。
實現
if (MsgType.SCAN.getValue().equals(event)) { //已經訂閱後掃碼 開門 logger.info("MsgType.SCAN====" + inputMsg.getEventKey()); //查詢使用者資訊 AugeWechatUser wechatUser = augeWechatUserMapper.selectByPrimaryKey(custermname); if (param.length == 2) { OkHttpUtil.getInstance().doGet(BookApiUtils.GET_REDIS_SET + custermname + "/" + param[1]); } if (param.length == 3) { OkHttpUtil.getInstance().doGet(BookApiUtils.GET_REDIS_SET + custermname + "/" + param[2]); } String backMsg = MSG_SUCCESS; //資料庫未儲存該使用者 if (wechatUser == null) { //儲存該使用者,返回註冊圖文訊息 augeWechatUserMapper.insertOrUpdate(new AugeWechatUser(custermname)); ArticlesMessage outputMsg = getLoginMessage(custermname, servername, returnTime); backMsg = xs.toXML(outputMsg); logger.info("返回圖文訊息===" + backMsg); } else if (TextUtils.isEmpty(wechatUser.getPhone())) { //沒有註冊,返回註冊圖文訊息 ArticlesMessage outputMsg = getLoginMessage(custermname, servername, returnTime); backMsg = xs.toXML(outputMsg); logger.info("返回圖文訊息===" + backMsg); } String[] storeInfo = inputMsg.getEventKey().split("_"); if (storeInfo != null && storeInfo.length == 2) { AugeStore store = augeStoreMapper.selectStoreByCode(storeInfo[1]); if (store != null) { switch (storeInfo[0]) { //進門 case WechatConstant.INDOOR: logger.info("使用者==" + wechatUser.getPhone() + "掃碼請求進門"); inDoor(wechatUser, store); break; //出門 case WechatConstant.OUTDOOR: logger.info("使用者==" + wechatUser.getPhone() + "掃碼請求出門"); outDoor(wechatUser, store); break; default: break; } } }
注:使用者掃描二維碼開門,首先判斷使用者是否註冊,未註冊返回註冊的圖文訊息,已註冊呼叫開門方法。
進門
public void inDoor(final AugeWechatUser wechatUser, final AugeStore store) {
//內網穿透直接開門
taskExecutor.execute(new Runnable() {
@Override
public void run() {
OkHttpUtil.getInstance().doGet(WechatConstant.getUrl(store.getIp(), WechatConstant.INDOOR_URL + "?phonenum=" + wechatUser.getPhone()));
}
});
}
OKHttpUtil
public class OkHttpUtil {
private static OkHttpUtil okHttpUtil;
private static OkHttpClient okHttpClient;
private OkHttpUtil() {
/**
* OkHttp是一個第三方類庫,
* 用於android中請求網路
* 建立OkHttpClient物件
*/
okHttpClient = new OkHttpClient();
}
public static OkHttpUtil getInstance() {
if (okHttpUtil == null) {
okHttpUtil = new OkHttpUtil();
}
return okHttpUtil;
}
public String doGet(String url) {
/**
* 請求介面
* 建立Request物件
*/
Request request = new Request.Builder()
.url(url)
.build();
//得到request物件
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public String doPost(String url, Map<String, String> param) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> entry : param.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
RequestBody body = builder.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public String doPostParam(String url, Map<String, Object> param) {
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, Object> entry : param.entrySet()) {
builder.add(entry.getKey(), (String) entry.getValue());
}
RequestBody body = builder.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public String doPost(String url, String param) {
MediaType JSON = MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, param);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Call call = okHttpClient.newCall(request);
try {
Response response = call.execute();
return response.body().string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}