美文网首页
2019-04-03 海外版Stripe接入Google Pay

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

作者: 馒Care | 来源:发表于2019-04-03 19:52 被阅读0次

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

    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.写的不会很乱,也不会很详细。基本满足当前需求吧

    相关文章

      网友评论

          本文标题:2019-04-03 海外版Stripe接入Google Pay

          本文链接:https://www.haomeiwen.com/subject/vjftiqtx.html