详细接入文档
接入Demo找商务获取
1.1 场景说明
Paynicorn平台为广大开发者提供了聚合支付SDK开发工具包,可以帮助开发者缩短开发周期,提升开发体验,满足接入方不同场景下差异化的支付方式需求,通过集成支付SDK可以一站接入全球主流的本地化支付方式,包括:在线支付、短信支付、订阅支付等形式。
在线支付
应用场景:
适用于具备网络通信的场景,用户通过电子钱包、信用卡、银行转账、短信等方式进行在线支付。
具体操作流程:
步骤一:用户进入商户APP,选择商品下单、确认购买,进入支付环节,见图1.1;
步骤二:用户进入到paynicorn收银台界面,选择合适的在线支付方式,见图1.2;
步骤三:用户在支付页面输入支付要素,例如账户手机号、邮箱等信息,确认发起支付,见图1.3;
步骤四:用户返回商户APP,APP端根据获取的支付结果,释放服务或者产品。
图1.1商品展示页 图1.2支付方式选择页 图1.3支付确认页
短代支付
应用场景:
适用于不具备网络通信的场景,用户通过向电信运营商发送扣费短信,扣除用户手机卡内话费余额完成支付。
具体操作流程:
步骤一:用户进入商户APP,选择商品下单、确认购买,进入支付环节,见图2.1;
步骤二:用户确认短信发送,见图2.2;
步骤三:用户发送支付短信,见图2.3、图2.4;
步骤四:用户返回商户APP,APP端根据获取的支付结果,释放服务或者产品。
图2.1商品展示页 图2.2短信发送确认页 图2.3短信发送页 图2.4短信发送结果
订阅支付
应用场景:
适用于需要周期性扣款的场景,用户成功完成订阅后,按照固定时间周期扣除用户手机卡话费余额完成支付。
具体操作流程:
步骤一:用户进入商户APP,选择商品下单、确认购买,进入支付环节,见图3.1;
步骤二:用户在支付页面输入支付要素,确认发起支付,见图3.2;
步骤三:用户确定订阅信息,见图3.3;
步骤四:用户发送扣费短信,见图3.4;
步骤五:用户返回商户APP,APP端根据获取的支付结果,释放服务或者产品。
步骤六:根据用户订阅信息,按照订阅时间周期扣费,商户根据每期扣费结果,释放服务或者产品。
图3.1商品展示页 图3.2支付确认页 图3.3订阅信息确认页 图3.4发送扣费短信
1.2 接入支付方式判断
接入方根据网络条件、业务需求等因素,选择接入合适的支付方式,后续将会持续优化更新,以适用更多场景,敬请期待...
1.3 接入前准备
参考: 接入前的准备工作
1.4 接入说明
1.4.1 接入内容
SDK接入需要两部分的接入:
第一部分是Android客户端,建议接入工具为 AndroidStudio;
第二部分是服务端接入,接口为主,语言不限具体详见:服务端接入文档。
1.4.2 接入过程
1.4.3 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 属于内部小程序定制版,接入前先咨询商务人员
1.4.4 SDK客户端配置
在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")
...
}
1.5.0.0版本后支持增加登入模块,或者去掉任意一个支付方式
dependencies {
...
api('com.transsion.pay:paysdk:X.X.X.X'){
exclude module: 'sms-lib'//去掉短代
// exclude module: 'paynicorn-lib'//去掉在线支付
}
//如果需要登录功能引入下面依赖
//implementation("com.transsion.pay:palmid-lib: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权限
1.5 客户端支付时序图
1.6 接口调用流程
第一步:程序启动时初始化
请求方法:initAriesPay
接口作用:对支付SDK进行初始化
请求参数:
参数 | 必填 | 类型 | 说明 |
---|---|---|---|
context | Y | Context | 上下文对象 |
ap_id | Y | String | 渠道号 |
cp_id | Y | String | 商户编号 |
api_key | Y | String | 商品编号/产品密钥 |
InitResultCallBack | Y | interface | 回调对象 |
代码示例:
PaySDKManager.getsInstance().setStrict(true);//设置严格模式,默认true,设置true后,经过多次查询后,支付中也会返回失败
//初始化有多种入参方式
//支持所有支付方式
PaySDKManager.getsInstance().initAriesPay(context, ap_id, cp_id,api_key,
new InitResultCallBack() {
@Override
public void onSuccess(List<SupportPayInfoEntity> list, boolean supportOnlinePay, CountryCurrencyData countryCurrencyData) {
}
@Override
public void onFail(int code) {
}
});
}
//支持了单一支付方式的初始化,mode-可选StartPayEntity.PAY_MODE_SMS、StartPayEntity.PAY_MODE_ONLINE、StartPayEntity.PAY_MODE_ALL
PaySDKManager.getsInstance().initAriesPay(context, ap_id, cp_id,api_key,mode
new InitResultCallBack() {
@Override
public void onSuccess(List<SupportPayInfoEntity> list, boolean supportOnlinePay, CountryCurrencyData countryCurrencyData) {
}
@Override
public void onFail(int code) {
}
});
}
onSuccess返回参数:
参数 | 必填 | 类型 | 说明 |
---|---|---|---|
list | Y | List | 短代、线上订阅支持的金额列表 |
supportOnlinePay | Y | boolean | 是否支持在线支付,true为支持 |
countryCurrencyData | Y | 对象 | 当前国家币种信息实体 |
onFail返回code参数:
结果code | 类型 | 说明 |
---|---|---|
1000 | int | 初始化成功 |
102 | int | 无效的IMSI(SIM卡无效/未插入SIM卡/M平台没有READ_PHONE_STATE权限) |
103 | int | 无效的ap_id |
104 | int | 无效的cp_id |
105 | int | 无效的api_key |
SupportPayInfoEntity对象说明:
参数 | 类型 | 说明 |
---|---|---|
mcc | String | 运营商所属国家mcc,如460 |
mnc | String | 运营商吗,如20 |
simIndex | int | 手机SIM卡编号 |
payType | int | 支付类型,如StartPayEntity.PAY_MODE_ONLINE/StartPayEntity.PAY_MODE_SMS/StartPayEntity.PAY_MODE_ALL |
priceEntities | List | 金额币种列表 |
isOnlineMode() | Method | true-在线支付模式 |
isSmsMode() | Method | true-短代模式 |
PriceEntity对象说明:
参数 | 类型 | 说明 |
---|---|---|
price | double | 金额 |
currency | String | 币种 |
keyCodes | List | 计费点信息 |
mode | int | 标识线上订阅 |
cycle | String | 订阅周期 |
code | List | 支付方式code集合 |
isSupportSub() | Method | true-支持订阅支付 |
isSupportNormal() | Method | true-支持正常支付 |
注意:可以用方法isSupportSub()从原始数据list集合中过滤出线上订阅的金额集合、短代支付金额集合
CountryCurrencyData对象说明:
参数 | 类型 | 说明 |
---|---|---|
countryCode | String | 国家code |
currency | String | 币种 |
mcc | String | 运营商所属国家mcc,如460 |
usdRate | double | 本位币对美金的汇率,1美金等于多少本位币 |
minAmount | double | 在线支付可以使用的最低金额 |
maxAmount | double | 在线支付可以使用的最高金额 |
smsMinAmount | double | 短代支付最小金额 |
smsMaxAmount | double | 短代支付最大金额 |
smsRandomAmount | double | 短代支付随机金额 |
smsOptimalAmount | double | 短代支付最优金额 |
第二步:币种转换(可选)
美元转本位币
请求方法:convertUsdToLocal
接口作用:提供币种汇率换算,调用方根据业务决定选择是否调用
请求参数:
参数 | 必填 | 类型 | 说明 |
---|---|---|---|
context | Y | Context | 上下文对象 |
context | Y | context | 商品集合 |
CurrencyConvertCallBack | Y | 对象 | interface |
代码示例:
private void initConvert(){
//usd product prices
List<ConvertPriceInfo> priceEntities = new ArrayList<>();
for(int i = 0;i < 5;i++){
ConvertPriceInfo priceEntity = new ConvertPriceInfo();
priceEntity.productId = i+""; //productId
priceEntity.usdPrice = i; //product price :usd
priceEntities.add(priceEntity);
}
//convert
PaySDKManager.getsInstance().convertUsdToLocal(TestActivity2.this, priceEntities, new CurrencyConvertCallBack() {
@Override
public void convertResult(List<CurrencyConvertResultEntity> convertResultEntities) {
if(convertResultEntities.size() <= 0){
Log.i("MainActivity","not support country");
return;
}
for(CurrencyConvertResultEntity resultEntity:convertResultEntities){
Log.i("MainActivity","local currency price:" + resultEntity.toPrice + " " + resultEntity.toCurrency);
}
}
});
}
虚拟币转本位币
请求方法:convertVirtualToLocal
接口作用:虚拟币转本位币
请求参数:
参数 | 必填 | 类型 | 说明 |
---|---|---|---|
context | Y | Context | 上下文对象 |
context | Y | context | 商品集合 |
CurrencyConvertCallBack | Y | 对象 | interface |
代码示例:
private void convertVirtualToLocal(){
//usd product prices
List<ConvertPriceInfo> priceEntities = new ArrayList<>();
for(int i = 0;i < 5;i++){
ConvertPriceInfo priceEntity = new ConvertPriceInfo();
priceEntity.productId = i+""; //productId
priceEntity.virtualPrice = i; //虚拟币金额
priceEntity.virtualCurrency = "AHA"; //虚拟币币种
priceEntities.add(priceEntity);
}
//convert
PaySDKManager.getsInstance().convertVirtualToLocal(TestActivity.this, priceEntities, new CurrencyConvertCallBack() {
@Override
public void convertResult(List<CurrencyConvertResultEntity> convertResultEntities) {
if(convertResultEntities.size() <= 0){
Log.i("MainActivity","not support country");
return;
}
for(CurrencyConvertResultEntity resultEntity:convertResultEntities){
Log.i("MainActivity","local currency price:" + resultEntity.toPrice + " " + resultEntity.toCurrency);
}
}
});
}
ConvertPriceInfo对象说明:
参数 | 是否必填 | 类型 | 参数说明 |
---|---|---|---|
productId | Y | String | 需要转换币种的商品id |
usdPrice | Y | Double | 需要转换币种的商品美金价格 |
virtualPrice | Y | Double | 需要转换币种的商品虚拟币价格 |
virtualCurrency | Y | String | 需要转换的虚拟币币种 |
CurrencyConvertResultEntity对象说明:
参数 | 是否必填 | 类型 | 参数说明 |
---|---|---|---|
productId | Y | String | 需要转换币种的商品id |
toCurrency | Y | String | 本位币币种码 |
toCountryCode | Y | String | 本位币所属国家码 |
fromPrice | Y | Double | 金额转换之前的美金金额 |
toPrice | Y | Double | 金额转换之后的本位币金额 |
第三步:发起支付
请求参数:
参数 | 必填 | 类型 | 说明 |
---|---|---|---|
context | Y | Context | 上下文对象 |
StartPayEntity | Y | Object | 支付参数封装 |
StartPayCallBack | Y | Object | 回调对象 |
StartPayEntity参数说明:
参数 | 必填 | 类型 | 说明 |
---|---|---|---|
amount | Y | double | 商品价格 |
payMode | N | int | 支付模式码:StartPayEntity.PAY_MODE_ONLINE: 在线支付,StartPayEntity.PAY_MODE_SMS:短代支付,StartPayEntity.PAY_MODE_ALL:全部支付方式 |
netPaySp | N | String | 在线支付渠道码,用于指定在线支付的细节渠道, 来源于服务端回调数据 |
orderNum | Y | String | 支付流水号(不能重复,用于支付交易处理) |
referenceNo | N | String | 商户内部订单号(只透传,不处理,用于商户标记内部订单,可以通过支付侧的服务端回调接口、查询接口获取referenceNo,商户进行订单信息匹配) |
currency | Y | String | 下单币种 |
countryCode | Y | String | 下单国家code |
description | N | String | 订单描述,会显示在收银台 |
matchDown | N | boolean | 设置为true-支持向下取支持金额的功能,当支付方式支持的金额小于发起支付的金额,开启这个功能可以匹配到该支付方式。默认为true |
minDiscountRatio | N | double | 最小折扣 |
type | Y | int | 支付方式是否订阅,StartPayEntity.PAY_TYPE_SUB 为订阅,默认为普通支付 |
adjustMode | N | int | (短代设置为-1、在线支付自行设置)设置adjustMode会根据设置 的mode,结合对应的币种来处理传入的金额各个位数取整,以防传入的金额渠道不支持导致无法支付。mode取值详见BigDecimal的各个mode,默认不设置。 |
N | String | 邮箱 | |
phone | N | String | 手机号 |
payMethod | N | String | 订阅运营商code |
cycle | N | String | 订阅周期 |
orderDescription | 订阅支付必传-Y、其它可以不传-N | String | 订单描述会显示在收银台(内容cp主自己定义) |
serviceConfigPriority | N | boolean | 支付方式后台配置优先 默认true |
memo | N | String | 额为参数 |
发起在线支付或者短代支付
请求方法:startPay
接口作用:发起在线支付或者短代支付支付请求
代码示例:
private void startPay(){
//非必填字段可以传空
StartPayEntity startPayEntity = new StartPayEntity();
startPayEntity.amount = 10;//商品金额
startPayEntity.countryCode = "NG";
startPayEntity.currency = "NGN";
startPayEntity.orderNum = "orderNum";//商户订单号
startPayEntity.payMode = StartPayEntity.PAY_MODE_SMS;//StartPayEntity.PAY_MODE_ONLINE: 在线支付,StartPayEntity.PAY_MODE_SMS:短代支付,StartPayEntity.PAY_MODE_ALL:全部支付方式
startPayEntity.type = sub ? StartPayEntity.PAY_TYPE_SUB : 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码给到游戏,游戏可以根据对应的返回码作出相应的用户提示
OrderEntity对象说明:
参数 | 是否必填 | 类型 | 参数说明 |
---|---|---|---|
orderNum | Y | String | 平台订单号 |
cpOrderNum | Y | String | 商户订单号 |
txnId | Y | String | paynicorn订单号 |
payMode | Y | int | 支付模式 |
netPaySp | Y | String | 本次支付的渠道标识 |
netErrorMsg | Y | String | 网络预下单失败的错误原因 |
subscriptionTime | Y | long | 订阅时间 |
unSubscriptionTime | Y | long | 退订时间 |
lastDeductionTime | Y | long | 最近一次成功扣费时间 |
deductionCount | Y | int | 成功扣费次数 |
发起订阅支付
请求方法:startOnLineSubPay
接口作用:发起订阅支付请求
代码示例:
private void startOnLineSubPay(){
//非必填字段可以传空
StartPayEntity startPayEntity = new StartPayEntity();
startPayEntity.amount = 10;
startPayEntity.countryCode = "NG";
startPayEntity.currency = "NGN";
startPayEntity.orderNum = "orderNum";
startPayEntity.cycle = "";
startPayEntity.email = "";
startPayEntity.phone = "";
startPayEntity.payMethod = "";
startPayEntity.orderDescription = "内容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 订单号自行保存,查询订单需要该订单号
发起快捷支付
用以纯粹S2S对接的渲染支付方式
打开支付页面示例
//传入的quickPayUrl为s2s返回的url地址
Intent intent = PaySDKManager.getsInstance().getQuickPayIntent(this, quickPayUrl);
startActivityForResult(intent, REQUEST_CODE);
返回结果
//传入的quickPayUrl为s2s返回的url地址,相关code值如下,finish都代表支付行为完成,就可以利用订单号去查询订单结果
/*public static final int CODE_QUICK_PAY_INTENT_FINISH = 1;
public static final int CODE_QUICK_PAY_INTENT_CANCLE = -1;
public static final int CODE_QUICK_PAY_CONFIRM_FINISH = 2;
public static final int CODE_QUICK_PAY_CONFIRM_CANCLE = -2;
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
String result = data.getStringExtra(Consts.QUICK_PAY_KEY_RESULT);
int code = data.getIntExtra(Consts.QUICK_PAY_KEY_CODE, 0);
}
}
1.7 支付结果码表说明
下方从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是系统发送短信错误 |
1.8 订单查询接口
请求参数:
参数 | 必填 | 类型 | 说明 |
---|---|---|---|
orderNum | Y | String | 订单号 |
apiKey | Y | String | 商品编号/产品密钥 |
cpid | Y | String | 商户编号 |
OrderResultEntity对象说明:
参数 | 类型 | 参数说明 |
---|---|---|
txnNum | String | 交易流水 |
subscriptionTime | long | 订阅时间 |
unSubscriptionTime | long | 退订时间 |
deductionCount | int | 成功扣费次数 |
lastDeductionTime | long | 最近一次成功扣费时间 |
message | String | 说明信息 |
orderNum | String | 查询的订单号 |
txnType | String | 支付类型 |
payMethod | String | 支付方式 |
status | int | 订单状态 订阅失败-OrderResultEntity.PAY_RESULT_FAIL/订阅中-OrderResultEntity.PAY_RESULT_PAYING/订阅成功-OrderResultEntity.PAY_RESULT_SUCCESS/订阅取消OrderResultEntity.SUB_RESULT_CANCEL |
referenceNo | String | 商户内部订单号(只透传,不处理,用于商户标记内部订单,可以通过支付侧的服务端回调接口、查询接口获取referenceNo,商户进行订单信息匹配) |
线上订阅查询接口
请求方法:queryOnlineSubOrderStatus
接口作用:线上订阅查询接口
代码示例:
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()回调中处理下一次订阅支付
普通支付查询接口
请求方法:queryOrderStatus
接口作用:普通支付查询接口
代码示例:
PaySDKManager.getsInstance().queryOrderStatus(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) {
//订单支付失败
}
});
1.9 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"));
}
}
});
1.10 计费点查询接口
1、接口地址
2、VAS短信点播支付计费点使用说明:
1、mcc 国家码、mnc 移动运营商网络码,mcc和mnc 确定支持的国家和运营商收费通道;
2、匹配到接口返回内容中每个运营商(mnc)下面可以使用的计费点金额money字段列表,权重(managerWeight)不为0的计费点是可以使用的计费点,权重值会因为渠道调整随时发生变化;
3、只有用户手机sim卡所属运营商和对应计费点的运营商完全匹配,才有可能保证交易成功,反之,则一定失败;
4、原则上扣费指令的发送建议调用支付SDK完成,不建议自己封装短信内容发送,可能造成交易无法匹配,最终无法结算的情况
5、needNetwork 值为1,说明该计费点使用前置条件必须网络畅通
1.11 测试模式
短代测试设置
主要是为了短代功能部分的测试设计,因为在开发时是没有指定国家指定运营商的SIM卡的,可以通过 下面的方法来模拟
SMSTestUtil.setTestMode(true)//设置true时表示开启测试模式,并且是双卡模式,默认关闭
SMSTestUtil.setTestMCCMNC("62160");// 这 里 设 置 的 是 第 一 张 卡 的 mccmnc
SMSTestUtil.setTestMCCMNC2("62120");// 这 里 是 设 置 第 二 张 卡 的 mccmnc
//比如想要模拟尼日利亚的Airtel运营,那么就是设置62120
//那么模拟其他运营商时,找到对应运营商的mccmnc并设置即可
在线支付测试模式
应用默认为测试模式,在需要上线时需要联系商务,切换为正式模式
1.12支持游戏通过账号授权-获取authCode
根据authCode 调用paynicorn 服务端接口获取openId
PaySDKManager.getsInstance().getAuthCode(Activity.this, new PaynicornAuthListener() {
@Override
public void authResult(PaynicornOauthRsp oauthRsp) {
if (oauthRsp.code == 200) {
String authCode = oauthRsp.authCode;
}
}
});
1.13 术语说明
在线支付:
依赖于网络,通过电子钱包、信用卡、银行转账、DCB模式短代等方式完成支付。
短代支付:
分为DCB模式、VAS模式。其中:DCB短代支付属于在线支付的一种,通过向电信运营商发送扣费短信,扣除话费余额的形式完成支付,但是需要依赖于网络通信实时获取支付结果;VAS短代支付不依赖于网络条件,向电信运营商发送扣费短信后,支付结果依赖于运营商通知。
订阅支付:
通过向电信运营商发送扣费短信,运营商按照约定周期性扣除话费余额的完成支付;
MCC:
3位国家码,存在同一个国家多个MCC码情况。
MNC:
移动运营商网络码,同一个运营商存在多个MCC码。
计费点:
通过发送某条扣费短信内容,电信运营商可以从话费余额中扣除相应金额,该金额即为计费点,计费点及其扣费短信内容由电信运营商制定。
1.13 更新日志
V1.5.1.7
1、增加话费充值入口
2、AHA 集成 Aries SDK ,提供VAS支付能力给到快游戏
3、优化CP接入效率
V1.5.1.6
1、短代流程优化
2、纯在线支付方式初始化去掉phone权限
V1.5.1.5
1、短代支付权限优化-拒绝权限跳转到系统界面授权-不授权不能支付
V1.5.1.4
1.优化代码
V1.5.2.3
1.支持虚拟币支付 2.支持账户授权 3.支付入参优化