實測通過示损,可正常支付够傍,并在后臺看到相關(guān)支付數(shù)據(jù)
1.Stripe地址:
https://github.com/stripe/stripe-android/tree/f1d932f55303d02b9116588de1a104d3e80be035
直接參考example這個項目就好才睹,其他的直接忽略亮垫,視項目需求進行添加
2.Google Pay地址:
這里不放上來杆兵,是想強調(diào)如果要接入谷歌支付,最好是只參考一份文檔就好,不要各種參考咆畏,很亂图甜,真的亂
3.谷歌賬號申請:
強調(diào)一點,很多文章各種描述要如何申請鳖眼,如何添加各種七七八八的憑據(jù)等等黑毅。其實,只需要記住以下幾點
-申請谷歌賬戶钦讳,F(xiàn)Q申請矿瘦,自行百度
-申請后,在AS里面創(chuàng)建你的第一個demo愿卒,如上第一點Stripe里面的demo缚去,記住把包名換成你自己的,然后進行上傳到alpha內(nèi)測版琼开,或者Beta內(nèi)測版易结,不要發(fā)布到正式環(huán)境。
-審核通過后(其實也可以嘗試未通過后柜候,跑下Demo搞动,不建議)可以開始跑你的demo了,這個時候點擊Google Pay 到相關(guān)類中渣刷。
IsReadyToPayRequest request = IsReadyToPayRequest.newBuilder()
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_CARD)
.addAllowedPaymentMethod(WalletConstants.PAYMENT_METHOD_TOKENIZED_CARD)
.build();
Task<Boolean> task = mPaymentsClient.isReadyToPay(request);
task.addOnCompleteListener(
task1 -> {
try {
boolean result =
task1.getResult(ApiException.class);
if(result == true) {
//show Google as payment option
ToastUtils.showShort("success");
mGooglePayButton.setEnabled(true);
} else {
mGooglePayButton.setEnabled(true);
ToastUtils.showShort("no success");
}
} catch (ApiException exception) {
ToastUtils.showShort("exception");
}
});
}
這個方法鹦肿,根據(jù)官方文檔描述,是檢查當前手機是否支持Google Pay辅柴,我這里是換了幾臺手機result都是false箩溃。所以為了可以正常測試支付功能,這里直接繞過判斷碌嘀,默認都是支持支付功能涣旨。這點很重要,很多人卡在這一步股冗,一直在排查為啥都是返回false霹陡,雖然我也不清楚,但是據(jù)說要支持NFC吧
4.假設以上都通過了魁瞪,你點擊mGooglePayButton支付動作的時候穆律,會提示你惠呼,手機谷歌必須安裝的組件导俘,如Google Pay套件,或者提示手機未登錄Google賬號剔蹋,所以繼續(xù)走下一步旅薄。
5.FQ在手機上登錄你的谷歌賬號,如果沒有賬號,麻煩從第一步重新看
6.安裝Google Pay---------------------------這一步很重要
7.安裝后少梁,如果你還沒有登錄洛口,你要登錄你的谷歌賬戶了,然后
===============================================
開始綁卡操作凯沪,要綁定啥卡呢第焰?強烈建議VISA或者JCB的卡,不懂的可以百度下妨马,綁卡后挺举,會扣費,1美金吧烘跺。不清楚后面會不會退湘纵。
8.當你綁卡后,你很開心的滤淳,重新打開你的demo準備去測試支付了梧喷。然并卵,依然不能支付脖咐,點擊后铺敌,在填寫了各種資料后,會彈出提醒:
請求失敗 交易遭拒:付款方式無效屁擅。了解詳情[OR-CCSEH-05]
如果遇到這個問題适刀,也不用百度了。你的付款方式出錯了煤蹭,我這里出現(xiàn)這個問題笔喉,是因為,我用Google pay綁定了同一張卡兩次硝皂,導致生成了兩個付款方式常挚,其中一個還是錯誤的。所以稽物,這個時候,請到Google Pay里面的常規(guī)設置里面贝或,拉到最下面吼过,有個更改默認設置的選項,切換一下咪奖,你的付款資料盗忱,點擊保存。
9.泡杯茶羊赵,重新運行趟佃,okay,付款流程都很暢通了。
10.與服務端進行交互
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case LOAD_PAYMENT_DATA_REQUEST_CODE:
switch (resultCode) {
case Activity.RESULT_OK:
PaymentData paymentData = PaymentData.getFromIntent(data);
// You can get some data on the user's card, such as the brand and last 4 digits
CardInfo info = paymentData.getCardInfo();
// You can also pull the user address from the PaymentData object.
UserAddress address = paymentData.getShippingAddress();
// This is the raw string version of your Stripe token.
String rawToken = paymentData.getPaymentMethodToken().getToken();
// Now that you have a Stripe token object, charge that by using the id
Token stripeToken = Token.fromString(rawToken);
if (stripeToken != null) {
// This chargeToken function is a call to your own server, which should then connect
// to Stripe's API to finish the charge.
// chargeToken(stripeToken.getId());
chargeToken("100",stripeToken.getId(),"usd");
}
break;
case Activity.RESULT_CANCELED:
ToastUtils.showShort("Cancel");
break;
case AutoResolveHelper.RESULT_ERROR:
Status status = AutoResolveHelper.getStatusFromIntent(data);
ToastUtils.showShort("Got error " + status.getStatusMessage());
// Log the status for debugging
// Generally there is no need to show an error to
// the user as the Google Payment API will do that
break;
default:
// Do nothing.
}
break; // Breaks the case LOAD_PAYMENT_DATA_REQUEST_CODE
default:
// Do nothing.
}
}
public void chargeToken(String amount,String tokenId,String currency){
Map<String,String> header = new HashMap<>(2);
header.put("Authorization","Bearer sk_test_RUHQk5aOliEJkJmyh02wI6Xp");
header.put("Content-Type","application/x-www-form-urlencoded");
RetrofitClient.getInstance().create(StripeService.class).charges(header,amount,currency,tokenId)
.compose(RxUtils.schedulersTransformer()).subscribe(new Observer() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Object o) {
ToastUtils.showShort( "支付成功");
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
public interface StripeService {
/**
* Desc:谷歌支付Stripe調(diào)用
* <p>
*
* Date: 2019-04-03
*
* @param amount 價格
* @param currency 單位
* @param source token數(shù)據(jù)
* @return observable
*/
@FormUrlEncoded
@POST("/v1/charges")
Observable<ResponseBody> charges(@HeaderMap Map<String, String> headers,@Field("amount") String amount, @Field("currency") String currency, @Field("source") String source);
}
11.如上闲昭,調(diào)用成功后罐寨,會執(zhí)行chargeToken這個方法,這個方法需要 跟服務端進行交互序矩,所以需要服務端接受付款的token信息以及付款信息鸯绿。
12.交互的接口可先使用Stripe的,不需要服務端介入簸淀,但是這個方式只適合測試楞慈,正式版本,最好不要使用這種方式啃擦。
13.寫的不會很亂囊蓝,也不會很詳細×铗龋基本滿足當前需求吧