2019-04-03 海外版Stripe接入Google Pay

实测通过,可正常支付,并在后台看到相关支付数据

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 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 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调用
     * 

* * Date: 2019-04-03 * * @param amount 价格 * @param currency 单位 * @param source token数据 * @return observable */ @FormUrlEncoded @POST("/v1/charges") Observable charges(@HeaderMap Map headers,@Field("amount") String amount, @Field("currency") String currency, @Field("source") String source); }

11.如上,调用成功后,会执行chargeToken这个方法,这个方法需要 跟服务端进行交互,所以需要服务端接受付款的token信息以及付款信息。
12.交互的接口可先使用Stripe的,不需要服务端介入,但是这个方式只适合测试,正式版本,最好不要使用这种方式。
13.写的不会很乱,也不会很详细。基本满足当前需求吧

你可能感兴趣的:(2019-04-03 海外版Stripe接入Google Pay)