微信js-sdk+JAVA实现分享接口

1 篇文章 0 订阅

1、获取公众号appid和secret

      登录微信公众平台-基本配置

2、配置JS安全域名

      公众号设置-功能设置

      注意:MP_verify_0MVuWBvVPoPJOmPF.txt服务器不能拦截

3、IP白名单配置

      打开baidu.com,搜索IP,将搜索结果在公众平台-基本配置-IP白名单内配置

4、前端代码展示

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: 'appId', // 必填,公众号的唯一标识  正式需要修改新申请公众号
    timestamp: timestamp, // 必填,生成签名的时间戳
    nonceStr: nonceStr, // 必填,生成签名的随机串
    signature: signature,// 必填,签名
    jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage'] // 必填,需要使用的JS接口列表
});
wx.ready(function(){
        //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口(即将废弃)
        wx.onMenuShareTimeline({
            title: '', // 分享标题
            link: '', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '', // 分享图标
            success: function () {
                // 用户点击了分享后执行的回调函数
            },
        });

        //获取“分享给朋友”按钮点击状态及自定义分享内容接口(即将废弃)
        wx.onMenuShareAppMessage({
            title: '百度测试', // 分享标题
            desc: '百度测试', // 分享描述
            link: 'http://sf8e39.natappfree.cc/admin', // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
            imgUrl: '', // 分享图标
            type: 'link', // 分享类型,music、video或link,不填默认为link
            dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
            success: function () {
// 用户点击了分享后执行的回调函数
            }
        });
});
function getSignature() {
    $.ajax({
        url: '' //请求链接
        , type: 'POST'  // 请求类型
        , dataType: 'json'  // 返回请求的类型,有text/json两种
        , async: false   // 是否异步
        , cache: false   // 是否缓存
        , timeout: null  // 设置请求超时
        , success: function (result) {
            //获取红包rmb中的信息
            if(result.code === 0){
                var data = result.data;
                timestamp = data.timestamp;
                nonceStr = data.nonceStr;
                signature = data.signature;
            }
        }
    });
}

5、后台代码展示

      1)接口

@RequestMapping(value = "/signature")
@ResponseBody
public Object signature() {
    logBefore(logger, "获取微信所需signature");
    Map<Object, Object> map = new HashMap<Object, Object>();
    PageData pd = new PageData();
    try {
        pd = WechatTool.getSignature();
        map.put("code", 0);
        map.put("msg", "成功");
        map.put("data", pd);
    } catch (Exception e) {
        logger.error(e.toString(), e);
        map.put("code", 1);
        map.put("msg", e.toString());
    } finally {
        logAfter(logger);
    }
    return AppUtil.returnObject(new PageData(), map);
}

    2)辅助工具

package com.fh.controller.wechat.tool;

import com.fh.util.HttpUtils;
import com.fh.util.Jurisdiction;
import com.fh.util.PageData;
import com.fh.util.UuidUtil;
import com.fh.util.pay.alipay.util.AlipayCore;
import com.fh.util.pay.tenpay.util.Sha1Util;
import net.sf.json.JSONObject;
import org.apache.shiro.session.Session;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * Created by 菜园子 on 2018/8/30.
 */
public class WechatTool {

    /*获取access_token入口*/
    public static String  getAccessTokenMain(){
        String result = "";
        boolean b;//是否调用微信重新获取access_token
        Session session = Jurisdiction.getSession();
        JSONObject sessionData = (JSONObject) session.getAttribute(WechatConfigure.CACHE_ACCESS_TOKEN);
        if (sessionData != null){
            Long timestamp = sessionData.getLong("timestamp");
            if (isValid(timestamp,System.currentTimeMillis())){
                result = sessionData.getString("accessToken");
                b = false;
            }else {
                b = true;
            }
        }else {
            b = true;
            sessionData = new JSONObject();
        }
        if (b){
            String message = getAccessToken();
            JSONObject data = JSONObject.fromObject(message);
            sessionData.put("accessToken",data.getString("access_token"));
            sessionData.put("timestamp",System.currentTimeMillis());
            session.setAttribute(WechatConfigure.CACHE_ACCESS_TOKEN,sessionData);
            result = data.getString("access_token");
        }
        return result;
    }

    /*获取access_token*/
    public static String getAccessToken(){
        String message = "";
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WechatConfigure.APPID + "&secret="
                + WechatConfigure.SECRET;
        message = request(url);
        return message;
    }

    /*获取jsapi_ticket入口*/
    public static String getTicketMain(){
        String result = "";
        boolean b;//是否调用微信重新获取access_token
        Session session = Jurisdiction.getSession();
        JSONObject sessionData = (JSONObject) session.getAttribute(WechatConfigure.CACHE_JSAPI_TICKET);
        if (sessionData != null){
            Long timestamp = sessionData.getLong("timestamp");
            if (isValid(timestamp,System.currentTimeMillis())){
                result = sessionData.getString("ticket");
                b = false;
            }else {
                b = true;
            }
        }else {
            b = true;
            sessionData = new JSONObject();
        }
        if (b){
            String accessToken = getAccessTokenMain();
            String message = getTicket(accessToken);
            JSONObject data = JSONObject.fromObject(message);
            sessionData.put("ticket",data.getString("ticket"));
            sessionData.put("timestamp",System.currentTimeMillis());
            session.setAttribute(WechatConfigure.CACHE_JSAPI_TICKET,sessionData);
            result = data.getString("ticket");
        }
        return result;
    }

    /*获取jsapi_ticket*/
    public static String getTicket(String accessToken){
        String message = "";
        String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi";
        message = request(url);
        return message;
    }

    /*获取signature*/
    public static PageData getSignature(){
        PageData result = new PageData();
        String nonceStr = SignTool.getRandomStringByLength(32);
        Long timestamp = System.currentTimeMillis();
        String params = "jsapi_ticket="+getTicketMain()+"&noncestr="+nonceStr+"&timestamp="+timestamp+"&url="+WechatConfigure.GET_SINATURE_URL;
        result.put("signature", Sha1Util.getSha1(params));
        result.put("timestamp",timestamp);
        result.put("nonceStr",nonceStr);
        return result;
    }

    /*请求数据*/
    public static String request(String url){
        String message = "";
        try {
            URL getUrl = new URL(url);
            HttpURLConnection http = (HttpURLConnection) getUrl.openConnection();
            http.setRequestMethod("GET");
            http.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            http.setDoOutput(true);
            http.setDoInput(true);


            http.connect();
            InputStream is = http.getInputStream();
            int size = is.available();
            byte[] b = new byte[size];
            is.read(b);

            message = new String(b, "UTF-8");

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return message;
    }

    /*判断session内容是否有效*/
    private static boolean isValid(Long timestamp,Long nowTimestamp){
        boolean b;
        if (nowTimestamp > timestamp){
            if ((nowTimestamp -timestamp) / 1000 > 7200){
                b = false;
            }else {
                b = true;
            }
        }else {
            b = false;
        }
        return b;
    }

    public static void main(String[] args) throws InterruptedException {
        PageData data = getSignature();
        System.out.println();
    }

}
package com.fh.controller.wechat.tool;

/**
 * Created by 菜园子 on 2018/8/30.
 */
public class WechatConfigure {
    public static final String APPID = "appId";//微信公众号appid
    public static final String SECRET = "secret";//微信公众号secret

    public static final String CACHE_ACCESS_TOKEN = "cache_access_token";
    public static final String CACHE_JSAPI_TICKET = "cache_jsapi_ticket";

    public static final String GET_SINATURE_URL = "";//wx.configure配置页面路径
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值