最近做了一个跨境物流方面的项目,涉及到了很多国内不常使用的库,如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了,再见