微信jsapi-java初步接入

【微信公众号对于开发者来说】

接触微信应该比大部分人都早,

记得那会开了微信号,大多数人还不知道什么东东,

微信发展如此迅速,着实很强大。

很多次要开发一些微信公众号的东西,

但是都卡在了“认证”上,

个人不能认证。


【发送给朋友的链接】

今天又遇到问题,想做一个自定义的发送给朋友的链接,

这么简单的功能,耗费了一下午,最后发现原来分享是需要认证的,

坑啊,做下记录,希望对有同样问题的人有帮助。


【java代码】

至于api什么的自己去看吧,虽然比较费劲,但是也不是很难,直接上封装了一部分的代码:

package com.uikoo9.util.external;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.json.JSONObject;

import com.uikoo9.util.core.data.QStringUtil;
import com.uikoo9.util.core.file.QPropertiesUtil;
import com.uikoo9.util.core.http.QHttpClientUtil;
import com.uikoo9.util.function.QCacheUtil;
import com.uikoo9.util.function.QEncodeUtil;
import com.uikoo9.util.function.QThreadUtil;

/**
 * 微信工具类
 * 1.校验合法性<br>
 * 2.获取accesstoken<br>
 * 3.获取jsticket<br>
 * 4.执行微信线程<br>
 * 5.获取jsapi相关参数map<br>
 * @author qiaowenbin
 * @version 0.0.2.20150617
 * @history
 *     0.0.2.20150617<br>
 *     0.0.1.20150206<br>
 */
public class QWeixinUtil {
    
    /**
     * 微信token校验
     * @param request
     * @param token
     * @return
     */
    public static String checkToken(HttpServletRequest request, String token){
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");
        
        return checkToken(signature, timestamp, nonce, echostr, token);
    }
    
    /**
     * 微信token校验
     * @param signature
     * @param timestamp
     * @param nonce
     * @param echostr
     * @param token
     * @return
     */
    public static String checkToken(String signature, String timestamp, String nonce, String echostr, String token){
        if(QStringUtil.allNotEmpty(signature, timestamp, nonce, echostr, token)){
            StringBuilder sb = new StringBuilder();
            String[] tmp = {token, timestamp, nonce};
            Arrays.sort(tmp);
            for(String s : tmp){
                sb.append(s);
            }
            
            String pwd = QEncodeUtil.sha1(sb.toString());
            if(signature.equals(pwd)) return echostr;
        }
        
        return QStringUtil.emptyStr;
    }
    
    /**
     * 获取access_token
     * @return
     */
    public static String getAccessToken(){
        try {
            String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + QPropertiesUtil.get("weixin.appid") + "&secret=" + QPropertiesUtil.get("weixin.appsecret");
            JSONObject json = new JSONObject(QHttpClientUtil.get(url));
            
            return json.getString("access_token");
        } catch (Exception e) {
            e.printStackTrace();
            
            return null;
        }
    }

    /**
     * 获取jsticket
     * @return
     */
    public static String getJsTicket(String token){
        try {
            String url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + token + "&type=jsapi";
            JSONObject json = new JSONObject(QHttpClientUtil.get(url));
            
            return json.getString("ticket");
        } catch (Exception e) {
            e.printStackTrace();

            return null;
        }
    }
    
    /**
     * 执行微信线程
     */
    public static void runWeixinThread(){
        QThreadUtil.runScheduledBySeconds(new Runnable() {
            public void run() {
                String token = getAccessToken();
                QCacheUtil.putToEHCache("weixintoken", token);
                QCacheUtil.putToEHCache("weixinjsticket", getJsTicket(token));
            }
        }, 1, 7100);
    }
    
    /**
     * 获取jsapi相关参数map
     * @param jsapi_ticket
     * @param url
     * @return
     */
    public static Map<String, String> getJsSignMap(String jsapi_ticket, String url) {
        Map<String, String> map = new HashMap<String, String>();

        String nonce_str = UUID.randomUUID().toString();
        String timestamp = Long.toString(System.currentTimeMillis() / 1000);
        String s = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "&timestamp=" + timestamp + "&url=" + url;
        String signature = QEncodeUtil.sha1(s);

        map.put("url", url);
        map.put("jsapi_ticket", jsapi_ticket);
        map.put("nonceStr", nonce_str);
        map.put("timestamp", timestamp);
        map.put("signature", signature);

        return map;
    }

}

主要分为三块:

1.token的验证

2.缓存accesstoken和jsticket

3.获取js相关参数


对应的配置文件:

# weixin properties
weixin.debug=false
weixin.token=y
weixin.appid=y
weixin.appsecret=y



另外在服务启动的时候需要调用:QWeixinUtil.runWeixinThread();


【页面】

跳转到页面的后台代码:

private void initWeixinInfo(BlogArticleModel blog){
        String jsTicket = (String) QCacheUtil.getFromEHCache("weixinjsticket");
        String url = "http://uikoo9.com/blog/detail/" + blog.getStr("blog_article_code");
        Map<String, String> map = QWeixinUtil.getJsSignMap(jsTicket, url);

        setAttr("wxdebug", QPropertiesUtil.get("weixin.debug"));
        setAttr("wxappid", QPropertiesUtil.get("weixin.appid"));
        setAttr("wxtime", map.get("timestamp"));
        setAttr("wxrandom", map.get("nonceStr"));
        setAttr("wxsign", map.get("signature"));
        setAttr("wxtitle", blog.getStr("blog_article_title"));
        setAttr("wxurl", map.get("url"));
    }



对应页面代码:

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
        <script type="text/javascript">
            wx.config({
                debug: ${wxdebug},
                appId: ‘${wxappid}‘,
                timestamp: ${wxtime},
                nonceStr: ‘${wxrandom}‘, 
                signature: ‘${wxsign}‘,
                jsApiList: [‘onMenuShareAppMessage‘]
            });
            wx.ready(function(){
                wx.onMenuShareAppMessage({
                    title: ‘${wxtitle}‘,
                    desc: ‘${wxtitle}‘,
                    link: ‘${wxurl}‘,
                    imgUrl: ‘http://uikoo9.qiniudn.com/@/img/logo.png‘
                });
            });
            /*
            trigger: function (res) {
                alert(‘用户点击发送给朋友‘);
            },
            success: function () { 
                alert(1);
            },
            cancel: function () { 
                alert(2);
            },
            fail: function (res) {
                alert(JSON.stringify(res));
            }
            wx.error(function(res){
                alert(JSON.stringify(res));
            });
            */
        </script>


【几点注意】

按上面的配置基本就可以了,需要注意几点:

1.善用wx.error,这个可以用来调试错误

2.善用wx.config中的debug:true,也是调试,感觉没有上面的有用


【坑爹的认证】

打开wx.error如果这个时候你看到的是:

微信jsapi-java初步接入

那么恭喜你,你成功了,


但是如果,点击发送给朋友还是没有自定义,那么恭喜你,

这个问题会纠结很久,


最后的最后我告诉你,因为没有进行微信认证,所以和“分享”有关的你都没有权限。

而微信的认证个人是不能认证的,去注册个公司吧~~


【更多】

更多精彩内容:uikoo9.com

微信jsapi-java初步接入

上一篇:微信平台服务号的申请


下一篇:做一个微信语音点播系统