开发人员快速接入文档
接入Demo找商务获取
第一步 SDK客户端配置
SDK当前最新版本1.5.4.18,建议使用最新的版本号替换掉示例代码中的 X.X.X.X
信息
1、查看历史版本 支付SDK版本
2、V1.5.4.7、V1.5.4.8、V1.5.4.9、V1.5.4.10、V1.5.4.11、V1.5.4.12、V1.5.4.15 属于内部小程序定制版,接入前先咨询商务人员
在Android Studio项目的根build.gradle中加入maven配置
buildscript {
repositories {
...
maven{ url 'https://mvn.shalltry.com/repository/maven-public'}
}
...
}
allprojects {
repositories {
...
maven{ url 'https://mvn.shalltry.com/repository/maven-public'}
}
}
在app的build.gradle文件中配置
dependencies {
...
api("com.transsion.pay:paysdk:X.X.X.X")
...
}
动态权限申请
建议在应用开启时,动态申请好以下权限,这样可以使支付流程更流程,如果不申请好,SDK也会在使用 到指定功能时自己申请
android.permission.READ_PHONE_STATE
android.permission.SEND_SMS
信息
1、支付SDK集成了短信发送功能用于支持短信支付,该方式需要应用获取较为敏感的权限,如果您的业务场景不需要使用运营商话费扣费,可以不用获取android.permission.SEND_SMS权限
2、在初始化过程中,支持了单一支付方式的初始化,mode-可选PaySDKManager.MODE_BOTH、PaySDKManager.MODE_PAYNICORN、PaySDKManager.MODE_SMS,如果您的业务只需要在线支付,可以传PaySDKManager.MODE_PAYNICORN,此时不需要获取用户android.permission.READ_PHONE_STATE权限
第二步 程序启动时(Application)初始化
ap_id、cp_id、api_key 找商务获取
代码示例:
PaySDKManager.getsInstance().initAriesPay(context, ap_id, cp_id,api_key,
new InitResultCallBack() {
@Override
public void onSuccess(List<SupportPayInfoEntity> list, boolean supportOnlinePay, CountryCurrencyData countryCurrencyData) {
//List<SupportPayInfoEntity> list 短代和线上订阅商品展示金额集合(返回什么展示什么、只需要关注金额price)
//for (SupportPayInfoEntity supportPayInfoEntity : list) {
//在线订阅金额集合subPriceList
//List subPriceList = supportPayInfoEntity.priceEntities.stream()
// .filter((PriceEntity priceEntity) -> priceEntity.isSupportSub())
// .collect(Collectors.toList());
//短代金额集合smsPriceList
//List smsPriceList = supportPayInfoEntity.priceEntities.stream()
// .filter((PriceEntity priceEntity) -> priceEntity.isSupportNormal())
// .collect(Collectors.toList());
//}
//获取金额
//for (SupportPayInfoEntity supportPayInfoEntity : list) {
// for (PriceEntity priceEntity : supportPayInfoEntity.priceEntities) {
// showLog("金额:" + priceEntity.price);
// }
//}
//-supportOnlinePay 为true 代表支持在线支付功能
//-countryCurrencyData 代表国家相关信息
// 只需要关注(支付要用到的参数)-国家code-countryCurrencyData.countryCode、支付币种countryCurrencyData.currency
// 线上支付最小金额countryCurrencyData.minAmount、线上支付最大金额countryCurrencyData.maxAmount
}
@Override
public void onFail(int code) {
}
});
}
第三步:发起支付
发起在线支付或者短代支付
代码示例:
private void startPay(){
//非必填字段可以传空
StartPayEntity startPayEntity = new StartPayEntity();
startPayEntity.amount = 10;//短代初始化返回金额、线上支付支持的最小最大金额之间任意值
startPayEntity.countryCode = countryCurrencyData.countryCode;//初始化返回countryCurrencyData对象
startPayEntity.currency = countryCurrencyData.currency;
startPayEntity.orderNum = "orderNum";//商户订单号-自己维护
//StartPayEntity.PAY_MODE_ONLINE: 在线支付,StartPayEntity.PAY_MODE_SMS:短代支付,StartPayEntity.PAY_MODE_ALL:全部支付方式
startPayEntity.payMode = StartPayEntity.PAY_MODE_SMS;
startPayEntity.type = 0 ;
//AHA商户快游戏增加字段
//startPayEntity.apiKey = "";
//startPayEntity.cpId = "";
try {
//payOrderNum 支付订单号
String payOrderNum=PaySDKManager.getsInstance().startPay(activity, startPayEntity, new StartPayCallBack() {
@Override
public void onOrderCreated(OrderEntity orderEntity) {
//订单创建成功,进入开始支付,如果后续因为崩溃等原因没有收到结果,可以根据这 里的订单号查询订单结果
}
@Override
public void onPaySuccess(OrderEntity orderEntity) {
//支付成功
}
@Override
public void onPaying(OrderEntity orderEntity) {
//本地查询超时,后续游戏去服务端确认
}
@Override
public void onPayFail(int code, OrderEntity orderEntity) {
//支付失败
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
注:在支付失败时,会返回响应的result码给到游戏,游戏可以根据对应的返回码作出相应的用户提示
发起订阅支付
代码示例:
private void startOnLineSubPay(){
//非必填字段可以传空
StartPayEntity startPayEntity = new StartPayEntity();
startPayEntity.amount = 10;//初始化返回金额
startPayEntity.countryCode = countryCurrencyData.countryCode;//初始化返回countryCurrencyData对象
startPayEntity.currency = countryCurrencyData.currency;
startPayEntity.orderNum = "orderNum";//商户订单号-自己维护
startPayEntity.cycle = "";//传空
startPayEntity.email = "";//取不到-传空
startPayEntity.phone = "";//取不到-传空
startPayEntity.payMethod = "";//取不到-传空
startPayEntity.orderDescription = "order description";//必传 不能为空 内容cp主自己定义
startPayEntity.netPaySp = "";//传空
try {
String subOrderNum=PaySDKManager.getsInstance().startOnLineSubPay(activity, startPayEntity, new StartPayCallBack() {
@Override
public void onOrderCreated(OrderEntity orderEntity) {
//订单创建成功,进入开始支付,如果后续因为崩溃等原因没有收到结果,可以根据这 里的订单号查询订单结果
}
@Override
public void onPaySuccess(OrderEntity orderEntity) {
//支付成功
}
@Override
public void onPaying(OrderEntity orderEntity) {
//本地查询超时,后续游戏去服务端确认
}
@Override
public void onPayFail(int code, OrderEntity orderEntity) {
//支付失败
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
注意: subOrderNum 订单号自行保存,查询订单需要该订单号
支付结果码表说明
下方从1开始的错误都是系统返回类型,属于系统处理短信发送失败时返回的错误码
result | 说明 |
---|---|
101 | 支付次数超过日限或者月限 |
102 | 无效的IMSI(SIM卡无效或者未插入SIM卡等) |
103 | 无效的ap_id(为空) |
104 | 无效的cp_id(为空) |
105 | 无效的api_key(为空) |
106 | 无法匹配 代码(mcc、mnc不匹配) |
107 | 无效的金额(金额为0或者当前支付金额无法匹配代码) |
108 | 上一次支付还未结束 |
110 | 没有读取手机信息的权限 READ_PHONE_STATE |
111 | 没有发送短信的权限 SEND_SMS |
112 | 支付失败 |
113 | 没有在清单文件注册AriesPayBroadcastReceiver广播(废弃) |
114 | 用户取消了支付 |
115 | 短信发送超时 |
116 | 支付配置出错 |
117 | 支付过于频繁 |
118 | 需要初始化 |
124 | 没有匹配的支付方式 |
125 | 没有合适的计费点 |
128 | 严格模式下,把查询到的支付中作为支付失败 |
129 | 支付中没有网络 |
130 | 发送短信时,取消支付 |
888 | 没有找到本地国家信息 |
1 | 发送出错(比如号码不接收等) |
2 | 无线了广播被明确地关闭(比如开启飞行模式) |
3 | 没有提供pdu(短信系统不正常) |
4 | 服务当前不可用(短信服务不可用) |
5 | 已达到发送队列限制(比如短信过长) |
6 | 结果错误FDN检查失败 |
7 | 拒绝高级短代码(比如二次校验短信发送被拒绝时) |
8 | 拒绝高级短代码(比如二次校验短信发送被拒绝时) |
其他 | 未知错误,小于100是系统发送短信错误 |
订单查询接口
线上订阅查询接口
代码示例:
PaySDKManager.getsInstance().queryOnlineSubOrderStatus(orderNum, apiKey, cpid, new OrderQuery() {
@Override
public void onSuccess(OrderResultEntity orderQueryEntity){
//订阅成功
}
@Override
public void orderError(OrderResultEntity orderQueryEntity, String code, String errorMessage) {
//网络错误导致-订阅失败
}
@Override
public void onPaying(OrderResultEntity orderQueryEntity) {
//订阅中-未确认结果
}
@Override
public void orderFail(OrderResultEntity orderQueryEntity) {
//订阅失败
}
});
注意:可以在orderError()/onPaying()/orderFail()回调中处理下一次订阅支付
第四步 Firebase接入
1、按照Firebase官方文档-使用Firebase控制台设置工作流方案接入Firebase官方地址
2、google-services.json 文件找商务获取
3、支付SDK埋点数据回调接口
代码示例:
PaySDKManager.getsInstance().setStatisticsSynchroListener(new StatisticsSynchroListener() {
@Override
public void track(String event, Bundle bundle) {
FirebaseAnalytics.getInstance(activity).logEvent(event, bundle);
if (event.equals(PaySDKStatistics.ARIES_EVENT_INIT_NAME)) {
FirebaseAnalytics.getInstance(context).setUserProperty("mccmnc", PayUtil.getSimOperator(context);
FirebaseAnalytics.getInstance(context).setUserProperty("AP_ID", bundle.getString("ap_id"));
FirebaseAnalytics.getInstance(context).setUserProperty("CP_ID", bundle.getString("cp_id"));
FirebaseAnalytics.getInstance(context).setUserProperty("API_KEY", bundle.getString("appkey"));
}
}
});
测试模式
短代测试设置
主要是为了短代功能部分的测试设计,因为在开发时是没有指定国家指定运营商的SIM卡的,可以通过 下面的方法来模拟
SMSTestUtil.setTestMode(true)//设置true时表示开启测试模式,并且是双卡模式,默认关闭
SMSTestUtil.setTestMCCMNC("62160");// 这 里 设 置 的 是 第 一 张 卡 的 mccmnc
SMSTestUtil.setTestMCCMNC2("62120");// 这 里 是 设 置 第 二 张 卡 的 mccmnc
//比如想要模拟尼日利亚的Airtel运营,那么就是设置62120
//那么模拟其他运营商时,找到对应运营商的mccmnc并设置即可
在线支付测试模式
应用默认为测试模式,在需要上线时需要联系商务,切换为正式模式