实测通过,可正常支付,并在后台看到相关支付数据
1.Stripe地址:
https://github.com/stripe/stripe-android/tree/f1d932f55303d02b9116588de1a104d3e80be035
直接参考example这个项目就好,其他的直接忽略,视项目需求进行添加
2.Google Pay地址:
这里不放上来,是想强调如果要接入谷歌支付,最好是只参考一份文档就好,不要各种参考,很乱,真的乱
3.谷歌账号申请:
强调一点,很多文章各种描述要如何申请,如何添加各种七七八八的凭据等等。其实,只需要记住以下几点
-申请谷歌账户,FQ申请,自行百度
-申请后,在AS里面创建你的第一个demo,如上第一点Stripe里面的demo,记住把包名换成你自己的,然后进行上传到alpha内测版,或者Beta内测版,不要发布到正式环境。
-审核通过后(其实也可以尝试未通过后,跑下Demo,不建议)可以开始跑你的demo了,这个时候点击Google Pay 到相关类中。
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");
}
});
}
这个方法,根据官方文档描述,是检查当前手机是否支持Google Pay,我这里是换了几台手机result都是false。所以为了可以正常测试支付功能,这里直接绕过判断,默认都是支持支付功能。这点很重要,很多人卡在这一步,一直在排查为啥都是返回false,虽然我也不清楚,但是据说要支持NFC吧
4.假设以上都通过了,你点击mGooglePayButton支付动作的时候,会提示你,手机谷歌必须安装的组件,如Google Pay套件,或者提示手机未登录Google账号,所以继续走下一步。
5.FQ在手机上登录你的谷歌账号,如果没有账号,麻烦从第一步重新看
6.安装Google Pay---------------------------这一步很重要
7.安装后,如果你还没有登录,你要登录你的谷歌账户了,然后
===============================================
开始绑卡操作,要绑定啥卡呢?强烈建议VISA或者JCB的卡,不懂的可以百度下,绑卡后,会扣费,1美金吧。不清楚后面会不会退。
8.当你绑卡后,你很开心的,重新打开你的demo准备去测试支付了。然并卵,依然不能支付,点击后,在填写了各种资料后,会弹出提醒:
请求失败 交易遭拒:付款方式无效。了解详情[OR-CCSEH-05]
如果遇到这个问题,也不用百度了。你的付款方式出错了,我这里出现这个问题,是因为,我用Google pay绑定了同一张卡两次,导致生成了两个付款方式,其中一个还是错误的。所以,这个时候,请到Google Pay里面的常规设置里面,拉到最下面,有个更改默认设置的选项,切换一下,你的付款资料,点击保存。
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调用
* <p>
*
* Date: 2019-04-03
*
* @param amount 价格
* @param currency 单位
* @param source token数据
* @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.如上,调用成功后,会执行chargeToken这个方法,这个方法需要 跟服务端进行交互,所以需要服务端接受付款的token信息以及付款信息。
12.交互的接口可先使用Stripe的,不需要服务端介入,但是这个方式只适合测试,正式版本,最好不要使用这种方式。
13.写的不会很乱,也不会很详细。基本满足当前需求吧