360SDK单机支付服务
2018-10-10 11:02 更新
1.1支付流程
流程介绍
1. 应用调用SDK支付接口
2. 360SDK展示支付页面,引导用户完成支付流程;
3. 支付结束或退出360SDK支付客户端界面后,360SDK客户端会返回支付结果给应用客户端的支付模块;
1.2支付接口-客户端调用
功能说明:
应用调用360SDK支付接口时, 360SDK弹出支付界面. 用户在界面上完成支付.
[注] 单机支付接口优先使用运营商短代支付,当短代通道不可用(如开发者没有申请相应运营商的短代支付,或运营商关闭了该短代支付方式)时,单机SDK自动调用奇虎360的在线支付方式。
接口形式:
public static void invokeActivity(Context context, Intent intent, IDispatcherCallback callback)
接口示例:
注意:
1、 必选参数不能为空, 不能为0,否则支付失败。
2、 参数名,以ProtocolKeys中定义的常量为准。
/**
* 使用360SDK的支付接口
*
* @param isLandScape 是否横屏显示支付界面
* @param isFixed 是否定额支付
*/
private void doSdkPay(boolean isLandScape, boolean isFixed) {
// 支付基础参数
Intent intent = getPayIntent(isLandScape, isFixed);
// 必需参数,使用360SDK的支付模块。
intent.putExtra(ProtocolKeys.FUNCTION_CODE, ProtocolConfigs.FUNC_CODE_OFFLINE_PAY);
Matrix.invokeActivity(this, intent, mPayCallback);
}
/***
* 生成调用360SDK支付接口基础参数的Intent *
* @param isLandScape
* @param pay
* @return Intent
*/
protected Intent getPayIntent(boolean isLandScape, boolean isFixed) {
Bundle bundle = new Bundle();
// 界面相关参数,360SDK界面是否以横屏显示。
bundle.putBoolean(ProtocolKeys.IS_SCREEN_ORIENTATION_LANDSCAPE, isLandScape);
// 可选参数,背景图片路径,必须是本地图片路径
bundle.putString(ProtocolKeys.UI_BACKGROUND_PICTRUE, "");
// *** 以下非界面相关参数 ***
//设置QihooPay中的参数
// 必需参数,所购买商品金额, 以分为单位。金额大于等于100分,360SDK运行定额支付流程; 金额数为0,360SDK运行
不定额支付流程。
bundle.putString(ProtocolKeys.AMOUNT, moneyAmount);
// 必需参数,人民币与游戏充值币的兑换比例,例如2,代表1元人民币可以兑换2个游戏币,整数。
bundle.putString(ProtocolKeys.RATE, Constants.DEMO_PAY_EXCHANGE_RATE);
// 必需参数,应用自定义的商品名称,建议中文,不建议使用英文下逗号(,)和双引号("),最大10个中文字。
bundle.putString(ProtocolKeys.PRODUCT_NAME, getString(R.string.demo_pay_product_name));
// 必需参数,应用自定义的商品id,最大16字符。
bundle.putString(ProtocolKeys.PRODUCT_ID, Constants.DEMO_PAY_PRODUCT_ID);
// 必需参数,游戏或应用名称,最大16中文字。
bundle.putString(ProtocolKeys.APP_NAME, getString(R.string.demo_pay_app_name));
// 必需参数,应用内的用户名称,如游戏角色名。最大16中文字。
bundle.putString(ProtocolKeys.APP_USER_NAME, getString(R.string.demo_pay_app_user_name));
// 必需参数,应用分配给用户的id。最大32字符。
bundle.putString(ProtocolKeys.APP_USER_ID, Constants.DEMO_PAY_APP_USER_ID);
// 可选参数,应用扩展信息1,原样返回,最大255字符。
bundle.putString(ProtocolKeys.APP_EXT_1, getString(R.string.demo_pay_app_ext1));
// 可选参数,应用扩展信息2,原样返回,最大255字符。
bundle.putString(ProtocolKeys.APP_EXT_2, getString(R.string.demo_pay_app_ext2));
// 可选参数,若应用方有服务器并且服务器需要知道支付结果,则传入此参数
//应用方提供的支付结果通知uri,最大255字符。360服务器将吧支付接口回调给该Uri,具体
//协议请查看文档中,支付结果通知接口—应用服务器提供接口
//注意:DEMO使用的应用服务器url(http://sdbxapp.msdk.mobilem.360.cn)仅限DEMO示范使用,禁止正式上线//游戏把DEMO
应用服务器当做正式应用服务器使用,请使用方自己搭建应用服务器。
Bundle.putString(ProtocolKeys.NOTIFY_URI, Constants. DEMO_APP_SERVER_NOTIFY_URI);
// =========================================================
// 联通、移动、电信短代支付
// 使用此功能时,需要先到360平台申请短信支付通道,并配合申请下来的 china_unicom.xml及china_telecom.xml 一同使
用才能支付成功。
// 商品ID(在360平台申请计费通道时填写的商品信息)
String goodInputId = etUnicomPayGoodInputId.getText().toString();
if(TextUtils.isEmpty(goodInputId)) {
goodInputId = Constants.DEMO_UNICOM_PAY_GOOD_INPUT_ID;
}
bundle.putString(ProtocolKeys.CONCH_PRODUCT_ID, goodInputId);
// 商户自定义订单号,长度必须为16字符,且首字母非零,否则影响支付结果
bundle.putString(ProtocolKeys.CONCH_DEFINED_ORDER, String.valueOf(System.currentTimeMillis()) + "000");
Intent intent = new Intent(this, ContainerActivity.class);
intent.putExtras(bundle);
return intent;
}
callback的 json数据格式:
成功返回
{error_code: 0, error_msg: "支付成功", content:""}
失败返回
{error_code: 1, error_msg: "支付失败", content:""}
取消返回
{error_code: -1, error_msg: "支付取消", content:""}
支付正在进行
{error_code: -2, error_msg: "正在进行", content:""}
callback示例:
// 支付的回调
private IDispatcherCallback mPayCallback = new IDispatcherCallback() {
@Override
public void onFinished(String data) {
Log.d(TAG, "mPayCallback, data is " + data);
if(TextUtils.isEmpty(data)) {
return;
}
boolean isCallbackParseOk = false;
JSONObject jsonRes;
try {
jsonRes = new JSONObject(data);
// error_code 状态码: 0 支付成功, -1 支付取消, 1 支付失败, -2 支付进行中, 4010201和4009911
登录状态已失效,引导用户重新登录
// error_msg 状态描述
int errorCode = jsonRes.optInt("error_code");
isCallbackParseOk = true;
switch (errorCode) {
case 0:
case 1:
case -1:
case -2: {
isAccessTokenValid = true;
isQTValid = true;
String errorMsg = jsonRes.optString("error_msg");
String text = getString(R.string.pay_callback_toast, errorCode, errorMsg);
Toast.makeText(SdkUserBaseActivity.this, text, Toast.LENGTH_SHORT).show();
}
break;
case 4010201:
//access_token失效
isAccessTokenValid = false;
Toast.makeText(SdkUserBaseActivity.this, R.string.access_token_invalid,
Toast.LENGTH_SHORT).show();
break;
case 4009911:
//QT失效
isQTValid = false;
Toast.makeText(SdkUserBaseActivity.this, R.string.qt_invalid,
Toast.LENGTH_SHORT).show();
break;
default:
break;
}
} catch (JSONException e) {
e.printStackTrace();
}
// 用于测试数据格式是否异常。
if (!isCallbackParseOk) {
Toast.makeText(SdkUserBaseActivity.this, getString(R.string.data_format_error),
Toast.LENGTH_LONG).show();
}
}
};
以上内容是否对您有帮助:
更多建议: