常见技术问题
一、安全支付插件
1.支付插件反复弹出安装界面
游戏接入的 Amigo_Play.apk 版本低于SDK包中Amigo_Play.apk版本。
SDK升级或接入时须同时替换SDK包中libs/com.gionee.gsp.jar和assets/gionee/Amigo_Play.apk。
2.出现“为了获得更安全和便捷的支付体验,请升级支付服务”,“下载”字样
Amigo_Play.apk没有打包到游戏中。
将游戏apk后缀改为zip,查看压缩包assets/gionee/目录下是否有Amigo_Play.apk。若无,请游戏确保在打包时将插件apk打包进去。
3.支付插件不静默安装
支付插件静默安装须满足:
a.游戏apk已用金立签名;
b.使用金立手机;
c.申请了权限
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />。
d.Amigo_Play.apk放在以下目录下
开发者只需关注c、d两点。因为开发者在上传apk后,Amigo后台会自动给apk签名。
二、平台初始化
1.提示初始化参数错误
请检查平台初始化函数APIKey是否为后台申请的值。
三、账号登录
1.Token验证成功什么状态
验证接口返回的数据是json格式,如果里面不包含“r”参数或“r”值为0,则认为验证成功,否则验证失败。
2.AmigoToken验证返回错误码1010
"r":"1010","err":"tick formatis error " ,
AmigoToken格式错误。请将获取的Token不做任何处理,直接作为账号安全验证请求数据的body。
"err":"notick":
没有提供AmigoToken
"err":"must offer id":
必须提供id参数
"err":"must offerts":
必须提供ts参数
"err":"must offernonce":
必须提供nonce参数
"err":"must offermac":
必须提供mac参数
"err":"must offerAuthorization":
必须提供Authorization头
3.AmigoToken验证返回错误码1011
a."r":"1011","err":"app sig verify fail"
游戏端与Amigo服务器生成的签名不一致,请验证mac签名算法是否正确。
1)确认secretKey 使用申请的值
2)确认AmigoToken签名是否正确方法:
使用参数:
String host = "id.gionee.com";
String port = "443";
String secretKey = "3990B23BBE6E4A12BEA4D59325E82B28";
String ts = "1411894798";
String nonce = "937DC049";
String method = "POST";
String uri = "/account/verify.do";
得到结果:
IZXHWQtlYfeBley5FXJSOW6Mkzw=
3)确认待签名字符串组装正确,包括ts,nonce,method,uri,host,port。
组装示例:
"1414202175\n
78DFA0D0\n
POST\n
/account/verify.do\n
id.gionee.com\n
443\n
\n"
4)确认传输数据完整性,没有在传输前被截取。可以在传输前加log打印。
5)将验证错误返回的wid字段值给账号服务端开发人员分析。
b."r":"1011","err":"verify app-key fail"
SecretKey不正确,须替换正确的SecretKey
c. "r":"1011","err":"tick is null"
AmigoToken传值为null或AmigoToken严重超时被清理。
须及时传登录成功后返回的toke作参数验证。
d. "r":"1011","err":"greater than maxtick verify times"
不能多次校检,只能验证一次。
e. 其他错误
tick is timeout :生成的AmigoToken超时(5分钟超时)。
appId is different : APIKey不统一
timestamp is different : ts不统一
nonce is different :
nonce不统一
tick is timeout:
被验证的tick已经过期
若按以上步骤还是不能定位问题,请开发者提供服务器返回的wid参数给账号服务端开发人员分析。
建议若有相应语言demo,先跑通demo,接入时换相应参数即可
4.登录账号时toast提示“应用不存在”?
请检查是否使用正确的APIKey。
5.启动游戏会弹出两个登陆框?
请确认登录接口在代码中只调用了一次,搜索关键字loginAccount。
6.AmigoToken验证是否必须?
可选,如果游戏注重账号安全须加上此步骤。
7.token验证时收不到回复?
请确认token验证请求已发送成功。
四、支付订单创建
1.创建订单的时候,希望增加自定义字段
创建订单时可在notify_url后面添加?xxx=xxx来传递自定义参数(参数字符要符合url规范,特殊字符需要urlEncode编码),例如: http://www.partner.com/notifyReceiver?param1=value1¶m2=value2 。自定义参数将在支付结果通知时通过URL原样传回给你们。
2.创建订单时在notify_url参数后面添加了自定义参数,自定义参数需要参与签名吗?
需要
3.请求创建订单时有一个notify_url,开发者平台也配置了一个支付回调地址,请问到底是以哪一个为准?
notifURL在代码中创建订单时可以设置,也可以后台配置,并以代码设置优先,代码中没有就用后台配置的。所以最好不要在创建订单的时候写死,如果创建订单notify地址写死了,后台配置的就无效了。
4.订单商品名称哪里设置
CP创建订单时的subject参数即为商品名称,需在代码中设置,无后台设置。详情可搜索开发文档“subject”字段。
5.创建支付订单里面的player_id可以自定义么?
创建支付订单所用的player_id不能自定义,必须是登陆成功后获取的playerId。
6.订单号超过32个字符,怎么办?
2.1.7版本将优化增加到64位
7.ASCII升序是什么?参考代码在哪?
ASCII升序即按字母升序排序(如果第一个字母相同,按第二个字母排序,依次类推),代码请参考Amigo_Play_Server_Demo中PayUtil.wrapCreateOrder函数
8.创建订单时返回”请求参数格式错误“
检查参数是否符合文档定义,所有参数都是以字符串类型提交。
a) 所有参数都是字符串类型,特别注意total_fee、deal_price、deliver_type、submit_time、expire_time字段值都需转换为String类型。
b) submit_time、expire_time格式为yyyyMMddHHmmss,即:年月日小时分钟秒20091227091010,且expire_time > submit_time
c)out_order_no 数字、字母及半角的符号“-”、“_”、“|”构成,32个字符以内,要确保订单号的唯一性,不能重复
d) subject 商品名称,32个字符以内,不能含有半角“+”、“&”或特殊字符集
9.创建订单时返回"status":"400010004","description":"签名错误,信息校验失败"
游戏生成签名与Amigo服务器生成签名不一致。
1.核对下签名算法是否有问题。
RSASignature. sign (signContent, privateKey, CharEncoding. UTF_8 );
signContent:
"DDFDAEC3DBF544DD99EB9F508B4299050.011201405280000001元宝201410241522030.01";
privateKey:
"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJZJoM3tJzf96lejbCsQsCgnMAdLtyvf9ZkflExjEUuQ1O7g+OuWc4ZrvtE+coWZmUt2IjYkws63XAbFt/aMEHu/qerp3g/Mn1Y+tVFVbsME+hqhTVknOtt7kv+ZyVymHXZEBvzlTQXiybUDXkRqvvu+hO/+4BhS6fNmuggYpbTnAgMBAAECgYBhIABOVT+NTgnOzYywYD6YFItTi7k7H6fnZ6M9oqCgx171ams0Ra0vaB6Pt93nPZb2T8hYWXWUhqdwsQLs0SQs9+91881Nu1JE1nPAyeQKWv0t6Ol8BavecvEGUcJPXJ1/zZFU7r+s3pdz7OnQV2b77VhZiLsaQsmrxLPALdeTkQJBAMSxDuQymonH0q9KbMAgZ/c7ZraQhc1erf8eb6ni+3eXoJkJBlYsFmp+zFxo6gfj8N8nl0sV1sD3g2HwcUTOimsCQQDDmpG0uqTmAGJryfZOp8YB3VqhTZfFf1xcXQGNkUsaNXFpLMd5O4haRlL4FiROenVucYd0VU4eZIOi33CkYdZ1AkEAjxxUvWykTIN7o9b+8XuiqZwqy8Kz2A1/hBRdIrroRMeqLi8G0UQauzmu773WKg+LfpKL3jHxo01z5prPj0TIKQJBAJl5BMv2Cf4A3ThPnXd3gg/iewLG28d1N6Wsv9Qw5Olqd1KbdON1R3X1aZIH5XLB+LOwViR77jBAk1xOzpXbwiUCQDX4cj4IWy6brwCFFOkcqY23veDTIB8vXC2Kg//Kv1vUJ41DM82/Ga7fBAqCgTHSow3QlByoMFokAxmkU6Zc5EE=";
得到sign:
K6azhShnDUTCCOUaxWPF2FzxESWRTd2Akm/xQFoJqG+zIG7FpNXGkni8qHEMukSMcfOpeRiD/Mt9eefoyNyA92Iq15zY6iaWv9ZquyuvqEkg5Dkq2JeSv9wTTjcLCuLsNkwumxdYB1pBspUu+gy+v5agKwqpRSEMzt0r5QMj0G8=
2.检查拼装待签名字符串内容signContent格式是否正确。
规则:将参数值按照参数名(不包括sign字段)按字母顺序排序,再将参数值直接连接,拼装待签名内容signContent:
“api_key值”+“deal_price值”+“deliver_type值”+“out_order_no值”+“subject值”+“submit_time值”+“total_fee值”
注意: 拼接的字符串无&连接,只是参数值连接无需参数名。
注意:这个接口是只要传了的参数都要加密。
10.创建订单时商品名参数 subject如果是英文,创建订单成功,如果是中文的话会返回 "status":"400010004","description":"签名错误,信息校验失败"
http请求需设置成utf8 格式。
httpclient可以这样设置
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
httpconnection可以这样设置
conn.getOutputStream().write(body.getBytes(CharEncoding.UTF_8));
isr = new InputStreamReader(conn.getInputStream(), CharEncoding.UTF_8);
五、启动收银台
1.代码混淆后无法启动收银台
如果你的apk有代码混淆,请添加以下忽略信息:
-keep public class * extends android.os.IInterface
-keep public class * extends android.os.Binder
-keepclass com.youju.statistics.**{*;}
2.支付窗口在部分非金立手机上无法调起
请先确认只是在部分非金立机型上(手机系统需是Android 4.0.0及以上)无法调起,若出现此问题,请开发者帮忙抓下log并录制下视频给金立同学分析。
3.调用支付时,客户端一直loading
此问题跟网络有关,请开发者帮忙抓下log给金立同学分析。
4.调起收银台,提示“订单不存在”
可能是下面的情况:
- 没有成功创建订单,找不到订单信息;
- 请求参数与创建的订单不匹配(注意submit_time参数,需要与创建订单提交的一致),找不到已创建的订单信息。
按下面步骤排除:
1、打印服务器创建订单返回的参数,检查游戏的服务器创建订单是否成功;
2、比较启动收银台所用参数值与创建订单时是否一致(包括api_key、out_order_no、submit_time)。
3、确保服务器创建订单成功后才调起客户端收银台。
5.用户连续点击,调起多个支付订单
游戏可以加一个创建订单loading或者控制订单生成间隔。可设置一个时间间隔,在这个时间间隔内使点击不处理任何事情。
6.点击支付窗口外围,支付窗口消失。
sdk目前设计如此,后续版本做调整。
7.在支付窗口界面按home键退出后,再次进入游戏支付窗口消失?
SDK考虑到安全问题,设计如此。后续版本会做调整。
8.账号登录后,进入收银台,还是弹出登录框
1. 必现出现,检查启动收银台的3个参数api_key、out_order_no、submit_time是否传值正确。
字段名 |
属性 |
是否必填 |
说明 |
api_key |
字符串 |
必填 |
申请创建该支付订单的APIKey |
out_order_no |
字符串 |
必填 |
商户订单号,与创建支付订单请求时相同 |
submit_time |
字符串 |
必填 |
订单提交时间,格式为yyyyMMddHHmmss。 与创建支付订单的“submit_time”字段是同一个值。 |
2. 概率出现,检查服务器的创建订单号是否成功,成功后才启动收银台
9.支付框弹起后返回,悬浮小图标消失。
新游接入使用了userId做唯一标识,应该是用playerId。
10.第一次启动收银台后直接返回,再次启动收银台,收银台不弹出, 悬浮按钮不显示。 多点几次“Amigo安全插件”无响应?
目前payEnd回调不是在ui线程中完成。游戏需要在ui线程中完成的事情请用handler来处理。
11.调起收银台,提示“订单不存在”
可能是下面的情况:
1没有成功创建订单,找不到订单信息;
2请求参数与创建的订单不匹配(注意submit_time参数,需要与创建订单提交的一致),找不到已创建的订单信息。
按下面步骤排除:
1、打印服务器创建订单返回的参数,检查游戏的服务器创建订单是否成功;
2、比较启动收银台所用参数值与创建订单时是否一致(包括api_key、out_order_no、submit_time)。
3、确保服务器创建订单成功后才调起客户端收银台。
12.悬浮按钮-充值,选择银行卡一键支付方式,选择充值金额然后立即充值,跳转至银行卡界面,再左上角返回,则弹出充值已处理,一直在无限自动查询界面,无法返回游戏。
此问题是易宝支付通道出现问题时,一直查询不到结果,就会轮询约2分钟(1+5+10+30+60),给人感觉是一直在无限查询界面。在2.2.0版本已经做了处理:当这个支付通道出现问题时,仅轮询16秒(1+5+10)后消失。
六、支付结果通知
1.金立后台的订单配置在那里写的?
开发者平台->游戏联运->我的Key->找到 ,自己写notify地址。可随时更改,更改立即生效
2.支付时提示“订单已完成支付!网络信号异常,请联系商户或稍后查询!
Amigo账户充值成功后,没有收到商户“success”字符串返回。
按以下顺序排查:
1.创建订单的服务器notify地址是否通
2.确认游戏服务器收到支付结果通知
3.确认收到支付通知后有返回纯“success”字符串
4.确认返回的纯“success”字符串正确性,无引号,前后无空格、换行符或其他字符
5.开发者提供异常订单号给金立支付服务器同学一起分析。
3.支付结果通知中user_id=null是否正常。
正常,user_id是为兼容老版本而保留,新版本已无作用
4.收到支付结果通知,签名验证不通过
1.确保使用申请的PublicKey
2.检查待验签字符串拼接格式是否正确:
拼接待验签数据规则:按照key的字母升序排序,以“key=value”形式用“&”拼接待验签内容checkContent:
“api_key键=api_key值”+“&”+“close_time键=close_time值”+“&”+“create_time键=create_time值”+“&”+“deal_price键=deal_price值”+“&”+“out_order_no键=out_order_no值”+“&”+“pay_channel键=pay_channel值”+“&”+“submit_time键=submit_time值”+“&”+“user_id键=user_id值”
示例:
api_key=7EBF116B7DC847C4A109F51C858320E4&close_time=20141024182157&create_time=20141024182003&deal_price=0.01&out_order_no=201410241819461369&pay_channel=100&submit_time=20141024182003&user_id=null
3.检查验签算法是否正确
七、其他问题:
1.u3d游戏引擎在登录时报错"gionee/gn_component_config.json找不到"
目前解决办法:将com.gionee.gsp.jar文件解压,把jar包里面assets目录下全部资源复制到项目的assets目录下.
2.金立sdk更新后找不到 logout接口了 ,这正常吗?如何切换账号?
正常,新版此接口已去掉。账号切换使用登录接口
mGnCommplatform.loginAccount(mActivity, Constants. LOGIN_REQUEST_CODE , false ,new IGnUiListener() {
将第三个参数改为false即可实现。
3.demo 的支付 是 真实扣费吗?
是的
4.playerid是32位的么?区分大小写么?
是32位,区分大小写
5.如何升级SDK?
下载最新sdk,下载地址: http://dev.game.gionee.com/help/sdk.html
替换 Amigo_Play.apk及com.gionee.gsp.jar
6.SDK中使用什么签名算法?
AmigoToken验证使用HMAC-SHA1签名
创建订单使用RSA签名
7.游戏中部分字体显示不全?
把现在游戏里面使用的字体打包到apk里面。
8.悬浮按钮-帮组,提问题一栏输入问题内容及信息,点击提交,无任何提交反馈提示
对未上线游戏的反馈,服务器会不做处理,等游戏正式上线后功能会正常。
9.返回商户类型不匹配
单机网游类型弄错了,申请单机参数接入网游SDK
10.在支付的时候提示订单信息不存在
没拿CP订单去请求或者时间错了或者是apiKey错了
11. 支付与创建订单用户不是同一个人
弄错了userId, 仔细照着文档,执行下单流程。下单不要发错参数了。
12魅族某些机型手机调不起支付
需要打开指定位置的权限:应用管理—金立钱包—权限管理—后台管理—允许后台运行
按下home键没有回调,下单成功后,关闭对话框,再调起支付,具体参见demo实现。
14.充值ip限制。
42.121.105.125
42.121.105.141
15.下单的时候提示订单已存在。
不要用相同的订单号来请求下单。
16.游戏加了金立签名和金立签名的签名信息如下。
证书指纹:
MD5: B4:97:92:A5:68:7B:64:14:92:E1:0A:29:15:2F:74:54
SHA1: 1B:B8:B4:F4:6E:AF:C2:A0:6A:46:BA:68:FD:8D:E5:43:A5:C6:5C:BD
SHA256: C2:D9:92:C8:A4:CD:A2:EE:D5:5F:69:35:7D:67:59:93:78:78:E9:A0:F0:B6:29:52:4E:88:AA:81:ED:65:F8:02
签名算法名称: SHA1withRSA
版本: 3。
17.微信调不起支付但属于正常情况。
1.微信账号在其它手机登录,被迫下线的这种情况 2.之前其它手机限制支付启动,也调用不了