1. 程式人生 > >使用微信公眾號實現掃碼開門

使用微信公眾號實現掃碼開門

隨著新零售時代的到來,許多店鋪使用微信公眾號實現掃碼開門,下面簡單介紹。

生成店鋪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;
    }
}