首页 > 编程知识 正文

微信公众平台开发总结报告,微信公众号活动总结

时间:2023-05-06 05:57:19 阅读:218541 作者:1625

                                                                              微信公众平台开发小结

时隔好几年,这几天又在捣鼓微信公众号的开发,现在微信公众平台分为订阅号,服务号,小程序三种,因为我们要通过授权获取微信用户信息,所以选择了公众号里的服务号。好久没开发公众号,开始闹了个笑话,用订阅号进行网页授权获取用户信息,后来一看接口权限才知道,订阅号不支持网页授权获取用户信息操作。

进入开发,如果你没有开发过公众号,你肯定会一脸懵,这个就是经验问题了。我以一个cdds的角度讲一下这个过程:

首先,打开官方的文档(https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html),这个文档还是必须看的,把开发前必读大致读一遍,了解一些基本知识还是很关键的,不然就会像我一样,拿个订阅号来进行网页授权。

开始开发,第一步,接入服务器,微信这一步的目的就是接入你的服务器。

1.:填写服务器配置,在这一步中,网上其实有很多教程,大致都一样,就是进行一个后端服务的签名验证,在 基本配置 –》服务器配置,进去之后填写你的服务器接口信息。这里说明一下,配置的路径不能使用ip和端口,只能使用域名,这个地方要注意一下

 

这里说明一下spring里面的接口,首先要有一个get接口来接受微信服务器发送的接口验证信息,代码如下,微信会传四个参数给你,让你去做一些加密操作,再回传给微信,以此来验证你服务器的可用性:这个地方网络上有很多例子,可以查到很多源代码,不用自己写,省的可能出错。我先把代码放这里也方便以后使用。

第二步就是网页授权获取用户的信息了,微信公众平台需要通过用户授权的方式来获取用户的信息,大概步骤就是重定向到微信的一个页面,让用户同意授权,回调的时候会给你code作为令牌,然后接着去拿一个token,最后根据token来拿用户的信息,这个步骤其实不复杂,dydkfd觉得是个很复杂的过程,有点担心,最终还是顺利拿下用户信息,代码如下:下面第一个图片重定向到微信的一个接口,然后参数里面有一个参数是填写微信回调你的接口,在返回的时候,微信会带上一个code参数给你,等等还有一些其他的参数,可以参考文档进行编写。

接下来看微信回调我们的接口

 

接口返回一个code参数给你,你可以调用获取access_token接口,这个接口就要使用我们的code参数,拿到我们获取用户信息需要使用的access_token参数。

 

最后就可以获取到用户信息了

 

获取到用户信息你就可以保存起来了,要用的时候随便用。

 

 

第三部就是微信服务器session的问题,因为微信不支持request的session机制,所以我们要想办法来保存一些需要缓存的东西,例如我们调用接口要用到的access_token,这里是根据网上的例子,可以用一个全局的集合(hashTable)来存储,为什么用hashTable而不用hashMap,这里主要是考虑到hashTable是线程安全的,所以不会出现多用户同时操作带来的线程安全问题。

 

hashTable是一个线程安全,不可重复的Map集合。

现在还有一个问题,就是每次要使用openId都必须去微信服务器获取,每次调用的页面都不一样,微信的这个接口是否可以带参数,我还没有验证。

 

第四部就是配合前端完成js-sdk的签名验证,这个原理是前端的某一个页面需要调用微信的js-sdk,所以在调用之前先进行签名认证,认证的大致原理就是根据我们的access_token,获取到一个jsapi的ticket,加上页面的url进行加密获取到一个signature,然后页面在进行签名认证,认证之后才能调用微信的一些前端接口,例如:经常用到的分享。后端接口代码如下:

注意这个url,url是前端传给你的,当前页面的路径,必须前端传,不能写死的。

 

签名的代码我也贴一下

/**
 * 生成签名
 * @param jsapi_ticket
 
* @param url
 
* @return
 
*/
public static Map<String, String> sign(String jsapi_ticket, String url) {
    Map<String, String> ret = new HashMap<String, String>();
    String nonce_str = create_nonce_str();
    System.out.println("nonce_str==="+nonce_str);
    String timestamp = create_timestamp();
    System.out.println("timestamp==="+timestamp);
    String signature = "";
    // 注意这里参数名必须全部小写,且必须有序
    String str = "jsapi_ticket="+jsapi_ticket+"&noncestr="+nonce_str+"&timestamp="+timestamp+"&url="+url;
    System.out.println("===content==="+str);
    try {
        MessageDigest crypt = MessageDigest.getInstance("SHA-1");
        crypt.reset();
        crypt.update(str.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", jsapi_ticket);
    ret.put("nonceStr", nonce_str);
    ret.put("timestamp", timestamp);
    ret.put("signature", signature);
    ret.put("appId", Constant.appId);
    return ret;
}
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);
}

这四个步骤下来,大致微信公众号的业务逻辑就畅通一些了,接下来可能会遇到跨域的问题,这个问题网上有许多办法,但是注意,get请求和post请求的跨域处理不太一样,需要注意一点。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。