使用微信公众号时,你是否常遇到权限和调试上的困扰?其实,只要掌握了正确的方法,这些问题就变得容易解决了。接下来,我会逐一为大家详细介绍。
个人订阅号权限受限
个人订阅号的使用受到不少限制,诸如不能使用二维码生成、网页授权、自定义菜单和微信支付等高级功能。以开设电商类的个人订阅号为例,因为缺少微信支付接口,用户无法在号内直接下单和支付,这给经营带来了诸多不便。不少个人运营者满怀希望地开始尝试,却因权限不足而遭遇发展瓶颈。
测试公众号来救场
在微信公众平台上,你可以申请一个测试账号,它比普通个人订阅号功能更丰富。申请过程并不繁琐,只需在指定页面扫描二维码进行登录。登录之后,你就能立刻查看腾讯分配给你的账号信息。有了这个测试账号,我们就能安心地搭建开发环境进行测试,就像拥有了一个微型实验基地,可以尽情地尝试新的点子。
公众号开发调试之痛
在开发微信公众号应用时,调试阶段特别麻烦。每次添加新功能,都得将其上传到公网服务器上测试。用户发起请求后,先到微信服务器,再转至我们服务器。为确保双方网络顺畅沟通,服务器需能被外部网络访问。小型创业团队面临的问题之一是,公网服务器的成本相对较高,而且频繁进行部署还会耗费大量的人力资源。
第三方软件来帮忙
常用内网穿透工具对比
natapp、ngrok和dingding都是常用的内网穿透软件。我试过这些软件,发现只有natapp适合做微信公众号的开发。用natapp,可以保证和微信服务器的稳定连接,不会出现连接中断的情况。不少小团队在尝试了多种软件后,觉得natapp最为便捷,有效解决了开发中的问题。
公众号接入微信平台
@Controller
@RequestMapping(value = "wx")
public class WeiController{
/**
* 公众号appid
*/
@Value("${wx.appid}")
private String appid;
/**
* 公众号appSecret
*/
@Value("${wx.secret}")
private String secret;
/**
* 微信消息接收和token验证
* @param request
* @param response
* @throws IOException
*/
@GetMapping("/weChatToken")
public void weChat(HttpServletRequest request, HttpServletResponse response) {
boolean isGet = request.getMethod().toLowerCase().equals("get");
if (isGet) {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {
try {
PrintWriter print = response.getWriter();
print.write(echostr);
print.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
资料上传完成后,微信平台会将GET指令发送至预设的服务器地址,并附带相关信息。若该请求确实来自微信平台,系统将直接返回echostr参数的值,表示接入成功,开发者身份得以确认;若非微信平台发起,接入尝试将不会成功。进入微信测试公众号的管理界面,准确输入外网映射的网址和代码中的token声明,操作完毕后,公众号即可与微信服务器进行无障碍沟通,这表明接入已经顺利完成。
微信网页授权得信息
public class CheckoutUtil {
public static String token = "999";
/**
* 验证签名
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToHex(digest );
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature) : false;
}
/**
* 十六进制字节数组转为字符串
* @param hash
* @return
*/
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash) {
formatter.format("x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
用户若在微信上查看其他网站,公众号便能利用微信网页授权手段取得用户的基本信息,包括openId等,之后便可以进行相关业务操作。比如,生活服务类的公众号在掌握了用户信息后,可为用户提供个性化的服务推荐,既让用户感到便捷,又增强了商家的营销成果。
开发微信公众号时,大家主要关心哪些功能权限?若您觉得这篇文章对您有所启发,不妨点个赞,并将它分享出去!
发表回复