項目里集成微信aar包虫啥,將微信刷臉的app安裝到有微信專門攝像頭的設(shè)備上拾枣。
微信人臉識別
1随橘,初始化操作:(先在application類中初始化)
private void initWxFacePay() {
WxPayFace.getInstance().initWxpayface(this, new IWxPayfaceCallback() {
@Override
? ? ? ? public void response(Map info)throws RemoteException {
if (!WxCallBack.successInfo(getApplicationContext(), info)) {
ToastUtil.show(getApplicationContext(), "微信支付初始化失敗");
? ? ? ? ? ? }
}
});
}
2.獲取rawData數(shù)據(jù)跷究。
private void getWxPayRawData() {
WxPayFace.getInstance().getWxpayfaceRawdata(new IWxPayfaceCallback() {
@Override
? ? ? ? public void response(Map info)throws RemoteException {
if (!WxCallBack.successInfo(mContext, info)) {
toast("getWxPayRawData()調(diào)用失敗");
return;
? ? ? ? ? ? }
String rawData = (String) info.get(RETURN_RAWDATA);
? ? ? ? ? ? if (rawData ==null) {
toast("rawData為空");
return;
? ? ? ? ? ? }
mPresenter.getAuthInfo(devoceId, rawData, storeId, storeName);
? ? ? ? }
});
}
3.拿到rawData數(shù)據(jù)與公司后端進行交互 拿到authorInfo數(shù)據(jù)洛退,(authorInfo很關(guān)鍵)
后端寫個接口,安卓這邊把相應(yīng)的數(shù)據(jù)傳給他夹抗。
4.人臉識別?
private void doFaceRecognize(String type) {
HashMap params2 =new HashMap();
? ? params2.put(FACE_AUTHTYPE, type);
? ? params2.put(APPID, appId);
? ? params2.put(MCH_ID, machId);
? ? params2.put(STORE_ID, storeId);
? ? params2.put(AUTHINFO, mAuthInfo);
? ? WxPayFace.getInstance().getWxpayfaceUserInfo(params2, new IWxPayfaceCallback() {
@Override
? ? ? ? public void response(final Map info)throws RemoteException {
if (!WxCallBack.successInfo(mContext, info)) {
toast("getWxpayfaceUserInfo()調(diào)用失敗");
return;
? ? ? ? ? ? }
final String openid = (String) info.get(OPENID);
? ? ? ? ? ? final String nickname = (String) info.get(NICKNAME);
? ? ? ? ? ? final String faceCode = (String) info.get(FACE_CODE);
? ? ? ? ? ? if (!TextUtils.isEmpty(openid)) {
runOnUiThread(new Runnable() {
@Override
? ? ? ? ? ? ? ? ? ? public void run() {
Intent intent =new Intent(mContext, X5WebActivity.class);
? ? ? ? ? ? ? ? ? ? ? ? intent.putExtra("openid", openid);
? ? ? ? ? ? ? ? ? ? ? ? intent.putExtra("authInfo", mAuthInfo);
? ? ? ? ? ? ? ? ? ? ? ? startActivity(intent);
? ? ? ? ? ? ? ? ? ? ? ? stopWxpayface();
? ? ? ? ? ? ? ? ? ? }
});
? ? ? ? ? ? }
}
});
}
調(diào)用微信的getWxpayfaceUserInfo方法會自動打開微信app的攝像頭绳慎,有兩種模式FACEID-ONCE和FACEID-LOOP。ONCE模式是立馬調(diào)起攝像頭漠烧,LOOP模式是微信攝像頭在后臺進行活體檢測杏愤,當(dāng)有人在攝像頭前,他檢測到以后才會調(diào)起攝像頭已脓。
識別成功后可以拿到faceCode和openId
刷臉支付
1.前面幾步與人臉識別前面相同 先初始化珊楼,再獲取rawData,再拿authInfo度液,
2.進行支付操作
private void doPay() {
HashMap params =new HashMap();
? ? params.put(APPID, appId);
? ? params.put(MCH_ID, machId);
? ? params.put(STORE_ID, storeId);
? ? params.put(OUT_TRADE_NO, payNum ="zrlcs" + (System.currentTimeMillis() /100000));
? ? params.put(TOTAL_FEE, fee);
? ? params.put(FACE_AUTHTYPE, facePay);
? ? params.put(ASK_FACE_PERMIT, facePermit);
? ? params.put(AUTHINFO, mAuthInfo);
? ? params.put(ASK_RET_PAGE, retPage);
? ? params.put(FACTORY, true);
? ? WxPayFace.getInstance().getWxpayfaceCode(params, new IWxPayfaceCallback() {
@Override
? ? ? ? public void response(Map info)throws RemoteException {
if (!WxCallBack.successInfo(mContext, info)) {
toastError(getResources().getString(R.string.pay_error));
return;
? ? ? ? ? ? }
mFaceCode = (String) info.get(FACE_CODE);
? ? ? ? ? ? mPresenter.getBackendData(mOpenId, mFaceCode, payNum);
? ? ? ? }
});
}
調(diào)用微信的getWxpayfaceCode方法會自動跳到微信的刷臉支付頁面厕宗,刷臉成功后會返回faceCode
此時需要拿著這個faceCode和openId與公司后端進行交互,后端返回一個成功或失敗的狀態(tài)
3堕担,支付成功返回你自己的app
private void backApp() {
final Map params =new HashMap<>();
? ? params.put(APPID, appId);
? ? params.put(MCH_ID, machId);
? ? params.put(STORE_ID, storeId);
? ? params.put(AUTHINFO, mAuthInfo);
? ? params.put(PAY_RESULT, "SUCCESS");
? ? WxPayFace.getInstance().updateWxpayfacePayResult(params, new IWxPayfaceCallback() {
@Override
? ? ? ? public void response(Map info)throws RemoteException {
if (!WxCallBack.successInfo(mContext, info)) {
toastError(getResources().getString(R.string.pay_error) +",updateWxpayfacePayResult()調(diào)用失敗");
? ? ? ? ? ? }
isPaySuccess =true;
? ? ? ? }
});
}
拿到后端狀態(tài)后(這里直接填入了SUCCESS)已慢,調(diào)用微信的updateWxpayfacePayResult就可以更新結(jié)果并返回自己的頁面了。
貼幾個用到的工具類
public static boolean successInfo(Context context, Map info) {
if (info ==null) {
//? ? ? ? ? ? ToastUtil.show(context, "接口返回的info為空");
? ? ? ? ? ? return false;
? ? ? ? }
String code = (String) info.get(RETURN_CODE);
? ? ? ? String msg = (String) info.get(RETURN_MSG);
? ? ? ? if (code ==null || !code.equals(WxfacePayCommonCode.VAL_RSP_PARAMS_SUCCESS)) {
//? ? ? ? ? ? ToastUtil.show(context, "調(diào)用返回非成功信息" + msg);
? ? ? ? ? ? return false;
? ? ? ? }
return true;
? ? }