Android集成Nets支付

关于Android集成Nets支付

最近做了一个跨境物流方面的项目,涉及到了很多国内不常使用的库,如Here地图,还有就是今天要总结的Nets支付了。国外的支付有很多,至于为什么选择用Nets支付,用客户的说法就是用的人多。嗯…可以的。好了,废话不多说,先接需求。
首先打开网址登录账号准备查看文档NetsPay
好吧,不出意外的英文,先撸上翻译再说
简单看完一遍后大概明白了什么意思,和普通的集成三方库的姿势差不多,都是注册账号创建应用然后获取apikey什么的,再按照文档的集成步骤执行。虽然有的地方翻译的很生硬,但是不影响总体集成流程。我们按照文档一顿操作之后终于算是集成好了吧。对了,nets支付是集成arr文件的形式。先来运行下看看有没有报错吧。果然,和我自己项目的okhttp3冲突了(意思就是gradle懵逼了,不知道用哪个了)。这种情况以前也总遇到过,以前的解决方法就是去集成的sdk的源码中把冲突的依赖删除。但是这次不行,由于是引入arr方式集成的所以不能去修改源码。首先想到了怎么去删除aar文件中的okhttp依赖。于是很长时间过去了…一顿操作下来还是没有成功…没办法,开始百度,搜了一堆,有解决的方案,反正大概都是一种方法,在build.gradle中写上一句代码,意思就是删除相同的依赖(可以理解为当自身项目中的依赖和三方库的依赖重复时只用一个),感觉完美解决,再运行,这次直接崩溃了。赶紧查看日志,定位到了自己项目中封装的Retrofit网络请求的代码片,有个自定义拦截器空指针。are you kidding me?先不慌,咱们先分析一下,于是半个小时过去了…应该是我在gradle添加的那行代码默认了用nets库中的依赖,然后开始想解决方案,于是又很长时间过去了…不出意外地没有好的解决方法,一咬牙干脆把自己项目中的Retrofit的拦截器那给注释掉吧(由于项目时间很紧,没有办法)。然后再运行,嗯,果然可以了。但是这种解决方法也太…(项目空档期再回头仔细研究一下吧,前任小伙伴遗留的历史问题…)。
ok,现在可以开始撸代码了,nets支付官网给出了demo,先下载下来看看。不难:

PaymentRequestManager manager = PaymentRequestManager.getSharedInstance();
                    try {
                        manager.sendPaymentRequest(key, hmac, txnReq, new PaymentCallback() {
                            @SuppressLint("LongLogTag")
                            @Override
                            public void onResult(PaymentResponse paymentResponse) {
                                // To implement callback functions
                                if (paymentResponse instanceof DebitCreditPaymentResponse) {
                                    final DebitCreditPaymentResponse debitCreditPaymentResponse = (DebitCreditPaymentResponse) paymentResponse;
                                    String txnRes = debitCreditPaymentResponse.txnResp;
                                    String hmac = debitCreditPaymentResponse.hmac;
                                    String keyId = debitCreditPaymentResponse.keyId;


                                    Log.d("DebitCreditPaymentResponse", "txnRes: " + txnRes);
                                    Log.d("DebitCreditPaymentResponse", "hmac: " + hmac);
                                    Log.d("DebitCreditPaymentResponse", "keyId: " + keyId);

                                    // Next 4 lines show a simplified verification.
                                    // Basically checking if the hmac returned tallies with a hmac generated by our secret key
//                                    String hmacVerification = HMAC_Gen.generateSignature(txnRes, sKey);
//                                    Log.d("DebitCreditPaymentResponse", "hmacVerification: " + hmacVerification);
//                                    if (hmacVerification.equals(hmac)){
//                                        Log.d("DebitCreditPaymentResponse", "Verification Successful");
//                                    }

                                    try {
                                        JSONObject txnJSON = new JSONObject(txnRes);
                                        JSONObject msg = txnJSON.getJSONObject("msg");
                                        String stageRespCode = msg.getString("stageRespCode");
                                        Toast.makeText(TransportPaymentActivity.this, "Payment Success\nstageRespCode: " + stageRespCode, Toast.LENGTH_LONG).show();
                                        Log.d("DebitCreditPaymentResponse", "stageRespCode: " + stageRespCode);

                                    } catch (JSONException e) {
                                        e.printStackTrace();
                                    }


                                    // NETSPay payment will result in this callback.
                                } else if (paymentResponse instanceof NonDebitCreditPaymentResponse) {
                                    final NonDebitCreditPaymentResponse nonDebitCreditPaymentResponse = (NonDebitCreditPaymentResponse) paymentResponse;

                                    String txn_Status = nonDebitCreditPaymentResponse.status;
                                    Log.d("nonDebitCreditPaymentResponse", "txn_Status: " + txn_Status);
                                    Toast.makeText(TransportPaymentActivity.this, "nonDebitCreditPaymentResponse Payment Success", Toast.LENGTH_LONG).show();
                                }

                            }

                            @Override
                            public void onFailure(NETSError netsError) {
                                String txn_ResponseCode = netsError.responeCode;
                                String txn_ActionCode = netsError.actionCode;

                                Log.d("netsError", "txn_ResponseCode: " + txn_ResponseCode);
                                Log.d("netsError", "txn_ActionCode: " + txn_ActionCode);

                            }
                        }, context);
                    } catch (InvalidPaymentRequestException e) {
                        e.printStackTrace();
                        Log.e("InvalidPaymentException", e.getMessage());
                    } catch (Exception e) {
                        e.printStackTrace();
                        Log.e("Exception", e.getMessage());

能看出来需要几个参数 key,hmac,txnReq,这些都是在后台配置好了的,直接请求后台接口成功之后再获得以上三个参数然后传给nets就可以了。这里倒是没遇见什么问题。到这也就大功告成了,先喝一口我82年的矿泉水压压惊。嗯额,先吐出来一下,有个问题补充一下,上面的代码中有个地方需要传个context,吐槽一下,nets支付必须传AppCompatActivity,也就是说Activity必须继承自AppCompatActivity,但是我的项目中BaseActivity是继承的FragmentActivity,这怎么一步一个坑呢。没办法这个Activity单独适配吧…
这下终于可以了…

就在我要发表文章的时候,突然接到了不用Nets支付的通知,换用Stripe。我。。。干的漂亮(一口老血)

Android学习之路上努力奔跑的小白,欢迎各路大神指点,我要去撸gradle了,再见

你可能感兴趣的:(Android学习之路代码笔记,Android,支付,NetsPay)