亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Home WeChat Applet WeChat Development About the implementation code of WeChat's custom sharing function

About the implementation code of WeChat's custom sharing function

Jul 26, 2018 am 09:58 AM

The content of this article is about the implementation code of WeChat’s custom sharing function. The content is very detailed. Friends in need can refer to it. I hope it can help you.

Front-end During the time, I developed an information project, but when the sales department promoted WeChat, the shared link was directly a web link plus a sharing symbol, which was ugly and irregular, so I studied the customized sharing function of WeChat

Preparatory work:

1. Certify the appId and appSecret of the public account

2. Various links to obtain WeChat information (look for WeChat custom sharing API in this section, address: https:// mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)

# 獲取access_token請求地址
  getAccessTokenUrl: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s
  #獲取accessToken
  getAccessTokenOAuthUrl: https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code
  # 獲取用戶基本信息請求地址
  getUserInfoUrl: https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
  #獲取code
  getCodeUrl: https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=%s&scope=%s&state=%s#wechat_redirect
  #獲取ticket
  getTicketUrl: https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi

3.controller layer

/**
     * 微信配置信息實體
     */
    @Autowired
    private WeiXinProperties weiXinProperties;
    //微信參數
    private String accessToken;
    private String jsApiTicket;
    //獲取參數的時刻
    private Long getTiketTime = 0L;
    private Long getTokenTime = 0L;
    //參數的有效時間,單位是秒(s)
    private Long tokenExpireTime = 0L;
    private Long ticketExpireTime = 0L;

 /**
     * 微信自定義分享
     */
    @RequestMapping(value = "/getShareInfo", method = RequestMethod.POST)
    public Map<String, String> getShareInfo(HttpServletRequest request,
                                            HttpServletResponse response, String url) {
        //當前時間
        long now = System.currentTimeMillis();

        //判斷accessToken是否已經存在或者token是否過期
        if (StringUtils.isBlank(accessToken) || (now - getTokenTime > tokenExpireTime * 1000)) {
            JSONObject tokenInfo = getAccessToken();
            if (tokenInfo != null) {
                accessToken = tokenInfo.getString("access_token");
                tokenExpireTime = tokenInfo.getLongValue("expires_in");
                //獲取token的時間
                getTokenTime = System.currentTimeMillis();
                log.info("accessToken====>" + accessToken);
                log.info("tokenExpireTime====>" + tokenExpireTime + "s");
                log.info("getTokenTime====>" + getTokenTime + "ms");
            } else {
                log.info("====>tokenInfo is null~");
                log.info("====>failure of getting tokenInfo,please do some check~");
            }
        }
        //判斷jsApiTicket是否已經存在或者是否過期
        if (StringUtils.isBlank(jsApiTicket) || (now - getTiketTime > ticketExpireTime * 1000)) {
            JSONObject ticketInfo = getJsApiTicket(accessToken);
            if (ticketInfo != null) {
                log.info("ticketInfo====>" + ticketInfo.toJSONString());
                jsApiTicket = ticketInfo.getString("ticket");
                ticketExpireTime = ticketInfo.getLongValue("expires_in");
                getTiketTime = System.currentTimeMillis();
                log.info("jsApiTicket====>" + jsApiTicket);
                log.info("ticketExpireTime====>" + ticketExpireTime + "s");
                log.info("getTiketTime====>" + getTiketTime + "ms");
            } else {
                log.info("====>ticketInfo is null~");
                log.info("====>failure of getting tokenInfo,please do some check~");
            }
        }
        //生成微信權限驗證的參數
        Map<String, String> wechatParam = makeWXTicket(jsApiTicket, url);
        return wechatParam;

    }

    //獲取accessToken
    private JSONObject getAccessToken() {
        //String accessTokenUrl = https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
        //獲取微信端的accessToken
        String requestUrl = String.format(weiXinProperties.getGetAccessTokenUrl(), weiXinProperties.getAppId(), weiXinProperties.getAppSecret());
        String result = send(requestUrl);
        JSONObject jsonObject = JSON.parseObject(result);
        return jsonObject;
    }

    //獲取ticket
    private JSONObject getJsApiTicket(String access_token) {
        //String apiTicketUrl = https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
        // 通過acessToken 獲取ticket
        String requestUrl = String.format(weiXinProperties.getGetTicketUrl(), access_token);
        String result = send(requestUrl);
        JSONObject jsonObject = JSON.parseObject(result);
        return jsonObject;
    }

    //生成微信權限驗證的參數
    public Map<String, String> makeWXTicket(String jsApiTicket, String url) {
        Map<String, String> ret = new HashMap<String, String>();
        String nonceStr = createNonceStr();
        String timestamp = createTimestamp();
        String string1;
        String signature = "";

        //注意這里參數名必須全部小寫,且必須有序
        string1 = "jsapi_ticket=" + jsApiTicket +
                "&noncestr=" + nonceStr +
                "&timestamp=" + timestamp +
                "&url=" + url;
        log.info("String1=====>" + string1);
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
            log.info("signature=====>" + signature);
        } catch (NoSuchAlgorithmException e) {
            log.error("WeChatController.makeWXTicket=====Start");
            log.error(e.getMessage(), e);
            log.error("WeChatController.makeWXTicket=====End");
        } catch (UnsupportedEncodingException e) {
            log.error("WeChatController.makeWXTicket=====Start");
            log.error(e.getMessage(), e);
            log.error("WeChatController.makeWXTicket=====End");
        }

        ret.put("url", url);
        ret.put("jsapi_ticket", jsApiTicket);
        ret.put("nonceStr", nonceStr);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);
        ret.put("appid", weiXinProperties.getAppId());

        return ret;
    }

    /**
     * 發(fā)送請求
     *
     * @param url
     * @return
     * @throws Exception
     */
    String send(String url) {
        return HttpClientTools.post(url);
    }

    //字節(jié)數組轉換為十六進制字符串
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    //生成隨機字符串
    private static String createNonceStr() {
        return UUID.randomUUID().toString();
    }

    //生成時間戳
    private static String createTimestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }

4. Introduce share.js. The page to be shared

$(function(){
    var url = location.href.split(&#39;#&#39;).toString();//url不能寫死
    $.ajax({
        type : "post",
        url : "/user/login/getShareInfo",
        dataType : "json",
        async : false,
        data:{url:url},
        success : function(data) {
            wx.config({
                debug: false,////生產環(huán)境需要關閉debug模式
                appId: data.appid,//appId通過微信服務號后臺查看
                timestamp: data.timestamp,//生成簽名的時間戳
                nonceStr: data.nonceStr,//生成簽名的隨機字符串
                signature: data.signature,//簽名
                jsApiList: [//需要調用的JS接口列表
                    &#39;checkJsApi&#39;,//判斷當前客戶端版本是否支持指定JS接口
                    &#39;onMenuShareTimeline&#39;,//分享給好友
                    &#39;onMenuShareAppMessage&#39;//分享到朋友圈
                ]
            });
        },
        error: function(xhr, status, error) {
            //alert(status);
            //alert(xhr.responseText);
        }
    })
});

5. Introduce the core js and share.js shared by WeChat into the page to be shared

<script type="text/javascript" src="/resources/js/jweixin-1.2.0.js"></script>
<script type="text/javascript" src="/resources/js/share.js"></script>

6. In the current page

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

PHP Tutorial
1488
72