·微信公衆號後端開發文檔:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
·開始一些必須設置解讀:
登陸公衆號後臺,進行開發者設置===》https://mp.weixin.qq.com/
1.網頁授權域名設置
具體設置
2.ip白名單配置(白名單來源的ip纔可獲得access_token)
access_token是公衆號的全局唯一接口調用憑據,公衆號調用各接口時都需使用access_token。開發者需要進行妥善保存。access_token的存儲至少要保留512個字符空間。access_token的有效期目前爲2個小時,需定時刷新,重複獲取將導致上次獲取的access_token失效。
3.服務器配置(可做自定義回覆、跳轉)
·後端接入指南原理:
開發者提交信息後,微信服務器將發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數如下表所示:
參數 | 描述 |
signature | 微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數。 |
timestamp | 時間戳 |
nonce | 隨機數 |
echostr | 隨機字符串 |
開發者通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容,則接入生效,成爲開發者成功,否則接入失敗。加密/校驗流程如下:
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者獲得加密後的字符串可與signature對比,標識該請求來源於微信
意思是說:對微信服務器發過來消息忠token、timestamp、nonce三個參數進行加密處理,然後加密得到的字符串與signature微信加密簽名相比較,如果相等則返回echostr隨機字符串。
·下面是後端提供回調接口:
@Slf4j
@Api(tags = {"微信回調API"})
@Controller
@RequestMapping("/plutoadmin/wechat")
public class WechatController {
//公衆號授權驗籤
@ApiOperation(value = "公衆號授權驗籤", notes = "公衆號授權驗籤")
@RequestMapping(value = "/getWechatPublicAuthorization", method = RequestMethod.GET)
@ResponseBody
public String getWechatPublicAuthorizationHttpServletRequest(String signature, String timestamp, String nonce, String echostr) {
if (WxPublicCheckSignature.checkSignature(signature, timestamp, nonce)) {
// 如果校驗成功,將得到的隨機字符串原路返回
log.info("驗簽字符串:{}", echostr);
return echostr;
}
return "驗籤錯誤";
}
}
驗籤工具類(網上很多此類代碼):
/**
* @author hanyy
* @Description: 公衆號後臺驗籤
* @date 2019/8/21 18:18
*/
public class WxPublicCheckSignature {
public static final String tooken = "Alan"; //開發者自行定義Token
public static boolean checkSignature(String signature, String timestamp, String nonce) {
//1.定義數組存放tooken,timestamp,nonce
String[] arr = {tooken, timestamp, nonce};
//2.對數組進行排序
Arrays.sort(arr);
//3.生成字符串
StringBuffer sb = new StringBuffer();
for (String s : arr) {
sb.append(s);
}
//4.sha1加密,網上均有現成代碼
String temp = getSha(sb.toString());
//5.將加密後的字符串,與微信傳來的加密簽名比較,返回結果
return temp.equals(signature);
}
public static String getSha(String str) {
if (str == null || str.length() == 0) {
return null;
}
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'};
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
}
➡接口編寫完成後,將驗籤接口填入url,注意token要填寫後端驗籤工具類中定義的token,否則無法驗簽完成
➡點擊提交,若正常提交,則回調驗籤成功,服務器配置成功~
➡常見錯誤:token驗證失敗 這就是微信回調驗籤失敗,檢查一下後端代碼。
➡注意:點擊右側啓用後會提示自定義菜單會失效,所以目前暫未啓用。
4.推送消息模板設置
根據業務需要去模板庫搜索,消息模板格式無法自定義,只可以改模板內容
申請好模板,把模板id配置到後端配置文件裏,防止模板變更,一個模板對應一個唯一模板id。