在完成調(diào)用芝麻信用人臉識別的時候,有一些可以記錄下來的內(nèi)容
/**
* 啟動支付寶進(jìn)行認(rèn)證
* @param url 開放平臺返回的URL
*/private void doVerify(String url) {
if (hasApplication()) {
Intent action = new Intent(Intent.ACTION_VIEW);
StringBuilder builder = new StringBuilder();
// 這里使用固定appid 20000067
builder.append("alipays://platformapi/startapp?appId=20000067&url=");
builder.append(URLEncoder.encode(url));
action.setData(Uri.parse(builder.toString()));
startActivity(action);
} else {
// 處理沒有安裝支付寶的情況
new AlertDialog.Builder(this)
.setMessage("是否下載并安裝支付寶完成認(rèn)證?")
.setPositiveButton("好的", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent action = new Intent(Intent.ACTION_VIEW);
action.setData(Uri.parse("https://m.alipay.com"));
startActivity(action);
}
}).setNegativeButton("算了", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
}).show();
}
}
/**
* 判斷是否安裝了支付寶
* @return true 為已經(jīng)安裝
*/private boolean hasApplication() {
PackageManager manager = getPackageManager();
Intent action = new Intent(Intent.ACTION_VIEW);
action.setData(Uri.parse("alipays://"));
List list = manager.queryIntentActivities(action, PackageManager.GET_RESOLVED_FILTER);
return list != null && list.size() > 0;
}
此處是通過服務(wù)端返回的url,給到芝麻信用官方給的調(diào)用支付寶人臉識別的方法,但是此處的url中包含認(rèn)證成功或者失敗之后回調(diào)的地址,其實這邊不能叫回調(diào),相當(dāng)于H5打開app的那種鏈接URL Scheme
URL Scheme 當(dāng)前頁面發(fā)送出去的給支付寶的消息,支付寶如何回復(fù)?然后回復(fù)還能到達(dá)指定界面呢?
在需要調(diào)用芝麻信用人臉的頁面,在AndroidManifest中配置
<!--要想在別的App上能成功調(diào)起App驾凶,必須添加intent過濾器-->
<intent-filter>
<!--協(xié)議部分领曼,隨便設(shè)置-->
<data android:scheme="xl" android:host="goods" android:path="/goodsDetail" android:port="8888"/>
<!--下面這幾行也必須得設(shè)置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
android:exported="false"
與
<action android:name="android.intent.action.VIEW"/>
沖突,所以不能設(shè)置
android:exported="false"
設(shè)置完成之后,在請求后端得到url中,需要將改革設(shè)置好的scheme信息發(fā)送給后臺,如果自己拼也要記得給,拼成的結(jié)果是xl://goods:8888/goodsDetail?goodsId=10011002,其中一直到goodsId之前的內(nèi)容都是在配置文件中配置的內(nèi)容,goodsId是自己定義的,在認(rèn)證成功或者失敗之后,通過自定義 goodsId去獲取數(shù)據(jù),方法如下:
Uri data = getIntent().getData();
String goodsId = data.getQueryParameter("goodsId");
會得到下面數(shù)據(jù):
params=YFK2tv7LqO05yH3sYA3XGSzUiEPDuWPk9AuAvT7ufMLscnDtqeSIATBRqZQgPw1dbxzJOCTbXEyCpizTa7hdFqB2FMo6o%2F1hDFjPyHIdkIFEv13Sj8PfCtcN2szcGeJDxmbsN2XoYgadDBFXBg5Y4F2CA4lKeksdotSKAnymaMc%3D&sign=By1D32vhk0QmewDQYQK50dwHtNv73Tdio7PPd%2FvjJJWKhhNCA2kl3hchApqDib4LlLDtDEOQxxLBKujiepjbmQN%2F2N2PNj9lJLluKnpBVEpTMvKbPLhn3opFmbdky%2F9Esj%2BuJRd8HENykCUsUKHXlYpSZKma7K%2F9%2FuTRY2sU%2FPY%3D
返回的數(shù)據(jù)需要后端解析,才能得出認(rèn)證的結(jié)果.
最后幾個小問題
1.在設(shè)置intent-filter中的data的時候,如果是放在app的入口Activity上,host和scheme的首字母要小寫,不然會出現(xiàn)app圖標(biāo)找不到的情況
2.如何判斷一個Scheme是否有效
PackageManager packageManager = getPackageManager();
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("xl://goods:8888/goodsDetail?goodsId=10011002"));
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isValid = !activities.isEmpty();
if (isValid) {
startActivity(intent);
}