前篇寫過項目中接入支付寶身份驗證接口,用於web網頁端的文章。我們這個項目又需要做微信公眾號,支付寶的接口自然是無法使用了,然後就查找微信有沒有這種接口。很多有這種需求的小夥伴,肯定也跟我一樣,知道有這個接口,但是找不到文檔、不知道是否適用公眾號、不知道如何申請。所以,就將我如何申請的供需要的人查閱。
ps:項目移動端是微信公眾號,不是微信小程序
一 明確目標
微信是提供了人臉識別驗證接口的,該接口目前是免費的,並且是適用公眾號的。由於該接口屬於未開放接口,所以在微信JS-SDK說明文檔是無法查看到該接口文檔的,需要寫郵件給騰訊進行申請審核,如果申請通過,騰訊會回覆郵件,開通對應公眾號的調用權限,並會發送接口文檔。
二 申請流程
想必有此需求的小夥伴都找到過該文檔:微信人臉核身接口能力,請忽略這裡面的小程序字樣,也就是說,該文檔同樣適用於微信公眾號,很多人看到都以為是小程序的申請方法,其實公眾號也是這樣申請的,只不過你發郵件申請通過後,給你的文檔裡的接口是requestWxFacePictureVerify。
首先,你的公眾號或小程序的主體類目要滿足上面文檔所要求的類目,然後就是發送郵件到騰訊工作郵箱了wx_city@tencent.com。郵件內容就是上面文檔所要求的表格內容。這是我申請的郵件:
騰訊的工作效率還是非常快的,一個小時就回復了郵件,這是騰訊的回覆郵件:
這是附件:
由於文檔中有內部文檔禁止外傳 字樣,這裡就不方便展示文檔內容了。如有需要,請發送郵件至騰訊申請。
拿到文檔,根據文檔開發就可以了。這個接口的調用還是非常簡單的,對於做公眾號開發的同學來說,應該是小case。
三 代碼
首先後端生成微信籤名:
@Value("${weChat.appId}")private String appId;
@Value("${weChat.appSecret}")private String appSecret;
@Autowiredprivate RedisCache redisCache;
@Overridepublic Map<String, Object> generateWxSignature(String url) { Map<String, Object> wxconfigMap = new HashMap<>(); String accessToken = redisCache.getCacheObject(Constants.ACCESS_TOKEN); String ticket = redisCache.getCacheObject(Constants.JSAPI_TIKET); if (StrUtil.isBlank(accessToken) || StrUtil.isBlank(ticket)) { String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret; String tokenStr = HttpUtil.get(tokenUrl); JSONObject tokenJson = JSONObject.parseObject(tokenStr); accessToken = tokenJson.getString("access_token"); if (StrUtil.isNotBlank(accessToken)) { String ticketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" + accessToken + "&type=jsapi"; String ticketStr = HttpUtil.get(ticketUrl); JSONObject ticketJson = JSONObject.parseObject(ticketStr); ticket = ticketJson.getString("ticket"); if (StrUtil.isNotBlank(ticket)) { int tokenExpires = Integer.parseInt(tokenJson.getString("expires_in")) - 60; int ticketExpires = Integer.parseInt(ticketJson.getString("expires_in")) - 60; redisCache.setCacheObject(Constants.ACCESS_TOKEN, accessToken, tokenExpires, TimeUnit.SECONDS); redisCache.setCacheObject(Constants.JSAPI_TIKET, ticket, ticketExpires, TimeUnit.SECONDS); } } }
if (StrUtil.isBlank(accessToken)) { throw new CustomException("獲取微信access_token失敗,請重試"); }
String noncestr = RandomUtil.randomString("abcdefj1234567890OPQRSTUVWXYZ", 8); long timestamp = System.currentTimeMillis(); String dataStr = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; String signature = SecureUtil.sha1(dataStr); wxconfigMap.put("signature", signature); wxconfigMap.put("noncestr", noncestr); wxconfigMap.put("timestamp", timestamp); wxconfigMap.put("appId", appId);
return wxconfigMap;}公眾號h5要先調用 wx.config:
import wx from 'weixin-js-sdk'import { generateSignature } from '@/api/appointment'
export function wxConfig(url) { generateSignature(url).then(res => { if (res.code == 200) { wx.config({ beta: true, debug: true, appId: res.data.appId, timestamp: res.data.timestamp, nonceStr: res.data.noncestr, signature: res.data.signature, jsApiList: ['requestWxFacePictureVerify'] }) } })}公眾號h5調用人臉識別接口:
import wx from 'weixin-js-sdk'import { wxConfig} from '@/utils/wechatPlugin'
const url = window.location.href.split('#')[0]wxConfig(url)wx.ready(function() { wx.invoke( 'requestWxFacePictureVerify', { request_verify_pre_info: '{"name":"' + name + '","id_card_number":"' + idCardNumber + '"}', check_alive_type: '1' }, function(res) { if (res.err_code == 0) { } else { Toast.fail('實名認證失敗') } } )})