一、前言
本系列教程將基於springboot2.1.8.RELEASE
完成
本文將實現
- 註冊賬號
- 接入微信
- 認證成爲開發者
二、進入微信公衆平臺註冊賬號
個人用戶建議註冊訂閱號
最後註冊成功如下:
三、接入認證成爲開發者
可參考微信官方開發文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
1、填寫服務器配置
選擇左下方的開發者工具,進入測試賬號開發
why?
測試賬號的權限多點,如果已經認證了的賬號可不需要利用測試賬號開發
登錄進去
填寫服務器 URL
和自定義的校驗Token
溫馨小提示:
- 微信公衆號接口必須以http://或https://開頭,分別支持80端口和443端口!
- 這裏的url可以選擇自己買的服務器地址,記得必須開放80端口去使用!
或者使用內網映射外網工具生成一個域名地址供給你開發使用,此方法自行百度,如下就是其中一種使用~
2、提交驗證URL有效性
配置好後,點擊提交,微信服務器會發送一個GET
請求到我們配置的地址上,在後臺通過get請求的方式獲取,請求的時候會傳入幾個參數
回到項目中,處理微信認證,然後啓動項目測試
溫馨小提示:這裏小編將自己的內網映射到外網了,方便本地測試~
@Slf4j
@RestController
@RequestMapping("/api/weixin/index")
@Api(tags = "微信 - 接口")
public class IndexController extends BaseController {
// TODO 這裏的token是微信公衆平臺上自己所配的!
private static final String token = "zhengqing";
/**
* 處理微信認證:驗證服務器地址的有效性,get提交
* signature: 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。
* timestamp 時間戳
* nonce: 隨機數
* echostr: 隨機字符串
*/
@GetMapping
public void checkSignature(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("============= 處理微信認證 ===============");
// 拿到微信的請求參數
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
// ① 將token、timestamp、nonce三個參數進行字典序排序 b a d c h ==>a b c d h
String[] strArr = {token, timestamp, nonce};
// 字典排序
Arrays.sort(strArr);
// ② 將三個參數字符串拼接成一個字符串進行sha1加密
StringBuffer sb = new StringBuffer();
// 字符串拼接
for (String str : strArr) {
sb.append(str);
}
// 加密
String sha1Str = SecurityUtil.sha1(sb.toString());
// ③ 開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信
if (sha1Str.equals(signature)) {
// 如果相等,就是來自微信請求
// 若確認此次GET請求來自微信服務器,原樣返回echostr參數內容,則接入生效
response.getWriter().println(echostr);
}
}
}
其中sha1加密工具類
public class SecurityUtil {
public static String sha1(String str) {
try {
StringBuilder sb = new StringBuilder();
MessageDigest digest = MessageDigest.getInstance("sha1");
// 放入加密字符串
digest.update(str.getBytes());
// 進行加密
byte[] digestMsg = digest.digest();
// byte轉換16進制
for (byte b : digestMsg) {
sb.append(String.format("%02x", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return str;
}
}
注意端口必須爲80端口哦!!!
3、測試接入認證
啓動項目後,回到微信公衆平臺,提交發送接入認證請求,如果配置正確,會提示配置成功,並保存配置信息
就這樣,我們簡單的完成了微信認證成爲開發者 ~