微信分享JSSDK接入

结果如下,自定义分享链接,分享图片等等...

开始对接

1.JS安全域名

 配置路径在:

         登录公众号号平台后,-----------进入公众号设置-------功能设置------,如下

JS安全域名强烈建议如下配置:

cylothes.cn

2获取和设置APP_ID,和APP_SECRET

 获取:

         微信公众号----基本配置----公众号开发信息---下

         

     AppId是唯一的

     APPSecret是每次都可以重新设置,丢了可以重设,不用担心

IP白名单,需要设置你线上的,在此可以提醒你一下, ip白名单,可以设置多个,空格隔开,通过内网穿透将您的本地id可以让微信访问,增加你调试的快捷性.

设置:

public class WeChatJsConfig {

    public final static String APP_ID = "你的APPID";
    public final static String APP_SECRET = "你的秘钥";
    public final static String GET_ACCESSTOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token";
    public final static String GET_TICKET_URL = "https://api.weixin.qq.com/cgi-bin/ticket/getticket";
    // public static ConcurrentHashMap<String, Object> INTERFACE_URL_PROPERTIES = new ConcurrentHashMap<>();
}

因为accessToken和Ticket 每天只能调用2000次,这里我们选择一个缓存方式即可我这里只做个例子自行参考

------------------------------------------定时更新Token和Ticket-----建议存redis中---------------------------------------------

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;


/**
 * @ClassName: 微信jsSDK 定时刷新
 * @Descripton:
 * @Author: sansy
 * @Date: 2019/7/4 15:30
 * @Version: 2.0
 */
@Component
@EnableScheduling
public class WeChatTask {
    //@Scheduled(cron = "0 0/2 * * * ?")//两分钟
    /**
     * 每隔两小时执行一次
     */
    @Scheduled(cron = "0 0 */2 * * ?")
    public void getTokenGetTicket() throws Exception {
        System.out.println("WeChatTask-执行一次");
//        //通过AppId和Secret获取 Access_token
//        Map<String, String> params = new HashMap<String, String>();
//        params.put("grant_type", "client_credential");
//        params.put("appid", WeChatJsConfig.APP_ID);
//        params.put("secret", WeChatJsConfig.APP_SECRET);
//
//        //获取accessToken
//        String accessTokenStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_ACCESSTOKEN_URL, params);
//        HashMap accessTokenMap = JSON.parseObject(accessTokenStr, HashMap.class);
//
//        String accessToken = accessTokenMap.get("access_token").toString();
//
//        //将结果存入
//        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("accessTokenMap", accessTokenMap);
//        System.out.println("1  " + WeChatJsConfig.INTERFACE_URL_PROPERTIES.hashCode());
//        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("accessToken", accessToken);
//        System.out.println("2  " + WeChatJsConfig.INTERFACE_URL_PROPERTIES.hashCode());
//
//        //1,清空参数集合
//        params.clear();
//        //传入参数
//        params.put("type", "jsapi");
//        params.put("access_token", accessToken);
//
//        String jsApiTicketMapStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_TICKET_URL, params);
//
//        HashMap jsApiTicketMap = JSON.parseObject(jsApiTicketMapStr, HashMap.class);
//        String jsApiTicket = jsApiTicketMap.get("ticket").toString();
//
//        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("jsApiTicketMap", jsApiTicketMap);
//        WeChatJsConfig.INTERFACE_URL_PROPERTIES.put("jsApiTicket", jsApiTicket);
//    }
//    @Scheduled(cron = "0 0/1 * * * ?")
//    public void testOne() {
//        System.out.println("===========================每分钟执行一次===========================");
//    }
//
//    @Scheduled(fixedRate = 30000)
//    public void testTwo() {
//        System.out.println("===========================每30秒执行一次===========================");
    }
}

-------------------------------------------------------------定时更新Token和Ticket-------------------------------------------------------------

给前端一个接口传入URL

controller层-----------------------------------------

@PostMapping("/jsSdk")
public DzResult jSSDKConfig(@RequestParam(value = "url") String url) {
    try {
        Map<String, String> configMap = customService.sign(url);
        return new DzResult().success(configMap);
    } catch (Exception e) {
        return new DzResult().error(1001, "调用失败");
    }
}

----------------------------------------------------------

service层

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 create_nonce_str() {
    return UUID.randomUUID().toString();
}

private static String create_timestamp() {
    return Long.toString(System.currentTimeMillis() / 1000);
}
@Override
public Map<String, String> sign(String url) {

    System.out.println("进入调用SDK----------------");
    //如果不存在,重新加载,覆盖
    boolean accToken = redisTemplate.hasKey("acctoken");
    System.out.println("是否有这个key  " + accToken);
    Map<String, String> params = new HashMap<String, String>();
    if (!accToken) {
        System.out.println("进入获取access");
        params.put("grant_type", "client_credential");
        params.put("appid", WeChatJsConfig.APP_ID);
        params.put("secret", WeChatJsConfig.APP_SECRET);

        System.out.println("appid:  " + WeChatJsConfig.APP_ID);
        //获取accessToken
        String accessTokenStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_ACCESSTOKEN_URL, params);
        HashMap accessTokenMap = JSON.parseObject(accessTokenStr, HashMap.class);

        String accessToken = accessTokenMap.get("access_token").toString();
        System.out.println("------------------------------------------------------");
        System.out.println("accessTokenMap:  " + accessTokenMap);
        System.out.println("access_token:  " + accessToken);
        System.out.println("------------------------------------------------------");
        //将结果存入
        redisTemplate.boundValueOps("acctoken").set(accessToken);
        //设置有效期为110分钟
        redisTemplate.boundValueOps("acctoken").expire(110, TimeUnit.MINUTES);
        //1,清空参数集合
        params.clear();
    }
    String accesstoken = redisTemplate.boundValueOps("acctoken").get().toString();

    Boolean aBoolean = redisTemplate.hasKey("ticket");
    if (!aBoolean) {
        //传入参数
        params.put("type", "jsapi");
        params.put("access_token", accesstoken);
        String jsApiTicketMapStr = HttpClientUtil.sendGet(WeChatJsConfig.GET_TICKET_URL, params);
        HashMap jsApiTicketMap = JSON.parseObject(jsApiTicketMapStr, HashMap.class);
        String jsApiTicket = jsApiTicketMap.get("ticket").toString();
        //将结果存入
        redisTemplate.boundValueOps("ticket").set(jsApiTicket);
        //设置有效期为110分钟
        redisTemplate.boundValueOps("ticket").expire(110, TimeUnit.MINUTES);
    }
    String jsTicket = redisTemplate.boundValueOps("ticket").get().toString();

    System.out.println("拿到的url为:  " + url);
    System.out.println("拿到的App_id为:   " + WeChatJsConfig.APP_ID);
    System.out.println("拿到的App_SECRET为:   " + WeChatJsConfig.APP_SECRET);
    System.out.println("拿到的AccessToken为:  " + accesstoken);
    System.out.println("拿到的ticket为:  " + jsTicket);

    Map<String, String> ret = new HashMap<String, String>();
    String nonceStr = create_nonce_str();
    String timestamp = create_timestamp();
    String string1;
    String signature = "";
    //注意这里参数名必须全部小写,且必须有序
    string1 = "jsapi_ticket=" + jsTicket +
            "&noncestr=" + nonceStr +
            "&timestamp=" + timestamp +
            "&url=" + url;
    System.out.println("有序的拼接参数为:    " + string1);
    try {
        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(string1.getBytes("UTF-8"));
        signature = byteToHex(crypt.digest());
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    ret.put("url", url);
    ret.put("jsapi_ticket", jsTicket);
    ret.put("nonceStr", nonceStr);
    ret.put("timestamp", timestamp);
    ret.put("signature", signature);
    return ret;
}

 

关于Springboot静态访问JS安全文件 非templates 模板模式

 

看了一个写的比较好的可以参考下,我没照着他的做,

参考文档:https://blog.csdn.net/wangyang00700/article/details/78256943

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue2中接入微信公众号JSSDK,您需要按照以下步骤进行操作: 1. 在公众号后台配置JS接口安全域名,确保您的域名已经添加到了微信公众平台的安全域名列表中。 2. 安装使用`weixin-js-sdk`库,可以通过npm进行安装: ``` npm install weixin-js-sdk ``` 3. 在需要使用JSSDK的组件或页面中引入`weixin-js-sdk`库: ```javascript import wx from 'weixin-js-sdk'; ``` 4. 在组件或页面的`mounted`生命周期钩子函数中初始化JSSDK,并进行相关配置: ```javascript mounted() { this.initWeChatJSSDK(); }, methods: { initWeChatJSSDK() { // 异步请求后端接口获取微信配置信息 axios.get('/api/getWeChatConfig') .then(response => { const { appId, timestamp, nonceStr, signature } = response.data; wx.config({ debug: false, appId, timestamp, nonceStr, signature, jsApiList: ['chooseImage', 'scanQRCode'] // 需要使用的JSSDK接口 }); wx.ready(() => { // JSSDK配置成功后的回调函数 console.log('JSSDK配置成功'); }); wx.error((res) => { // JSSDK配置失败后的回调函数 console.error('JSSDK配置失败', res); }); }) .catch(error => { console.error('获取微信配置信息失败', error); }); } } ``` 5. 在需要使用JSSDK的地方调用对应的接口,比如选择图片接口`chooseImage`: ```javascript methods: { chooseImage() { wx.chooseImage({ count: 1, success: function (res) { // 选择图片成功后的处理逻辑 const localIds = res.localIds; // ... }, fail: function (error) { // 选择图片失败后的处理逻辑 console.error('选择图片失败', error); } }); } } ``` 以上是在Vue2中接入微信公众号JSSDK的基本步骤,您可以根据实际需求进行相应的配置和调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值