支付SDK嵌入文档

当前版本:v4.2.9( 20170825 released )

最后更新于 2017-08-25

SDK下载【当前版本v4.2.9( 20170825 released )】

4.2.9 SDK嵌入资源文件汇总  20170825

 

Demo下载


强联网+第三方支付Demo Eclipse工程文件  9.3 MB


弱联网三网融合+支付宝+银联 Demo Eclipse工程文件  5.99 MB


Cocos2dx文档及demo工程文件  82.8 MB


u3d文档及demo工程文件  82.7 MB

 

注意:cocos2dx及u3d文档仅作为接入流程演示,资源文件以SDK嵌入资源包中提供的为准

 

 

外放产品渠道号查看插件  10.9 KB

使用方法:在手机上安装后打开,按Home键置于后台,运行已嵌入计费的游戏包点击计费点,将会弹出toast框提示计费信息及渠道号信息,以确认代码配置是否正确。

 

 

 

4.2.9更新内容(20170706):


1、针对网游用户sdk实名认证功能的更新。
2、计费sdk升级功能优化。
3、细节bug修复以及适配高版本。
包含但不仅限于以上内容

 

更新说明(427及以上建议更新):
4.2.8.01版本可直接替换libs下cn.egame.terminal.paysdk.jar,并将assets/egame下EGAME_128.zip替换更新至EGAME_129.zip;以及EPSH_144.zip替换更新至EPSH_147.zip,4.2.8.01以下版本建议按流程接入

 

 

 

4.2.8.01更新内容(20170706):


1、修改V427版本中的细节bug。
包含但不仅限于以上内容

 

更新说明(427建议更新):
4.2.7版本可直将工程内assets/egame下EGAME_127.zip文件替换更新至:EGAME_128.zip,4.2.7以下版本建议按流程接入

 

 

4.2.7更新内容(20170505):


1、优化双卡手机电信卡识别及支付能力。
2、修复手机上安装应用启动后再通过桌面应用打开会重复启动的问题。
3、优化部分手机短信发送失败回调监听。
4、为后续新版三网sdk更新铺垫。
包含但不仅限于以上内容

 

更新说明(建议更新):
4.2.6版本可直接替换libs下cn.egame.terminal.paysdk.jar,并将工程内assets/egame下EGAME_126.zip文件替换更新至:EGAME_127.zip,4.2.6以下版本建议按流程接入

 

 

4.2.6更新内容(20170221):


1、计费界面弹出底部菜单修改:由开启密码支付改成安全支付设计。
2、在安全支付设置界面中新增指纹支付功能,提高支付安全性。
3、新增和优化相关统计数据。
4、微信支付sdk更新至V2.0.2
包含但不仅限于以上内容

 

更新说明(建议更新):
4.2.5版本可直接将工程内assets/egame下EGAME_125.zip文件替换更新至:EGAME_126.zip;单电信基础包增加指纹权限,第三方支付sdk中微信的资源全部替换更新,activity配置有更新烦请务必参照资源包,4.2.5以下版本请按流程接入

 

 

4.2.5更新内容(20161202):


1、三网融合联通sdk更新到V411版本,接入方式有修改,请参考文档。老版本联通计费2017年将停止使用,请尽快更新
2、适配android6.0及以上系统权限管理,targetSdk=23。
3、单机新增支付30元以上计费跳转第三方支付,可直接传整型金额参数:EgamePay.PAY_PARAMS_KEY_TOOLS_PRICE。
4、第三方支付sdk中支付宝、微信、银联有更新
包含但不仅限于以上内容

 

更新说明(建议更新):
4.2.4版本可直接将工程内assets/egame下EGAME_124.zip和EPSH_141.zip文件替换更新至:EGAME_125.zip和EPSH_144.zip;第三方支付sdk中支付宝、银联、微信的资源及activity配置有更新烦请务必参照资源包内修改;三网融合联通计费新增so文件、assets下资源、 manifest配置修改以及需将Application类继承UnicomApplicationWrapper类,详见资源包内文档或参照demo,4.2.4以下版本请按流程接入

 

 

4.2.4更新内容(20161009):


1、优化图片加载和显示,提高加载速度和减少内存占用。
2、修改网游代金券列表展示该游戏该用户的全部代金券。
3、修复网游用户sdk帐号切换,退出弹框同步修改帐号。
4、新增短信发送超时时间自定义参数params(sendSmsOverTime),单位秒,自定义30s-100s之间
5、重新适配外放产品渠道号查看插件
包含但不仅限于以上内容

 

更新说明(非强制更新):
4.2.3版本可直接将工程内assets/egame下EGAME_123.zip文件替换更新至:EGAME_124.zip;4.2.3以下版本请按流程接入

 

 

4.2.3更新内容(20160822):


1、单机三网融合计费中联通计费流程优化,省去中间的一次确认界面。
2、支付界面提示内容优化。
3、网游退出页面中“礼包、攻略、论坛、问题反馈”当无权限访问时,则提示“对不起,该功能未开启”。
4、网游增加cp_info_md5字段作为参数传入,支付时可进行订单和价格校验
说明:cp_info_md5=Md5.getMD5String(cp自定义流水号+价格+APP_KEY);为了安全性,cp服务端进行md5返给游戏客户端;若不传则不校验
包含但不仅限于以上内容

 

更新说明(非强制更新):
4.2.2版本可直接替换 (1)libs下cn.egame.terminal.paysdk.jar (2)assets/egame下更新至:EGAME_123.zip;4.2.2以下版本请按流程接入

 

 

4.2.2更新内容(20160701):


1、配合新版计费文件feeInfoV2.dat使用,并兼容老版本feeInfo.dat。
2、三网计费联通sdk更新至V3.2.5。
3、网游pay接口增加网游回调地址的支付参数:otherNotifyUrl,可用于服务端回调测试
4、网游增加代金券全额抵消计费价格功能。

 

更新说明(非强制更新):
4.2.1版本直接替换assets/egame/EGMAE_121.zip, libs下cn.egame.terminal.paysdk.jar;三网融合联通更新至:Multimode_UniPay_baseV3.2.5.jar其余文件不需替换;4.2.1以下版本请按流程接入

 

 

4.2.1.03更新内容(20160608):

1、修复部分手机报-109问题。
2、网游点卡支付和充值卡支付成功提示语修改。

 

更新说明(非强制更新):
4.2.1版本直接替换assets/egame/EGMAE_121.zip即可,其余文件不需替换;4.2.1以下版本请按流程接入

 

 

4.2.1更新内容(20160511):

1、电信短代支付通道拓展。
2、修改网游计费成功提示语。
3、支持联通计费0.1元计费。
4、第三方支付:银联和支付宝sdk分别更新至V3.3.2、V15.0.8。
5、解决已有bug。

 

更新说明(非强制更新):
基础包:assets/egame/下更新至EGMAE_121.zip;第三方支付:银联和支付宝sdk分别更新至V3.3.2、V15.0.8,请将旧的银联支付相关sdk文件删除,导入新的资源

 

 

4.2.0更新内容(20160408):

1、增加单机短代上行支付结果校验。
2、三网融合联通支付sdk版本更新至V3.2.0。
3、三网融合支付新增移动通道。
4、本平台游戏三网融合移动通道拓展以及网盟渠道增加移动支付通道切换能力。
5、网游新增话费充值卡支付、游戏点卡支付,翼支付sdk有更新至V3.0.4。
6、解决已有bug。 更新说明(非强制更新):
三网融合短代能力加成中联通sdk有更新至V3.2.0,且增加了manifest相关配置;assets/egame/下更新至EGMAE_120.zip;翼支付sdk更新至V3.0.4

 

 

4.1.9.01更新内容(20160223):

1、修复在Android 5.1及以上系统可能存在的初始化异常。
2、修复平台申报的游戏道具别名存在换行符的问题。
3、本平台三网融合计费联通sdk新版本V3.0.0更新。
4、本平台游戏三网融合移动通道拓展以及网盟渠道增加移动支付通道切换能力。
更新说明(暂非强制更新):
4.1.6升级时请将工程中egame文件夹下的EGAME_XXX.zip、EPSH_XXX.zip 替换为 EGAME_119.zip、EPSH_141.zip;三网融合相关so及jar请全部替换。

 

 

4.1.6更新内容(20151126):

1、第三方支付新增微信支付通道
2、新增资源配置检查以及版本兼容行检查
3、兼容非主线程中调用pay方法
4、电信短代计费前,SDK会对用户进行限额查询,如有异常,则计费SDK会提示用户已超限额
5、SDK及支付界面显示的相关优化
6、支付宝版本更新(activity配置及jar包有变化请注意,详见sdk资源包对应文件夹)

 

更新说明:
旧版本升级时请务必替换所有assets、libs目录下资源文件,androidmanifest配置也请仔细检查更新,第三方支付及移动联通计费能力需要配置的内容也均在sdk资源包中

 

 

4.1.5更新内容(20151103):

1、全渠道支持游戏包名扩展一位
2、三网融合支付能力新增了计费通道(新增一个jar,新增manifest声明,详见资源文件内说明)
3、增加渠道号8位检测、初始化成功后错误码提示弹框仅在sdk调试模式下弹出
4.1.4-4.1.5更新流程:
非三网融合计费类型或不需要新增三网计费通道的游戏请直接将EGAME_114.zip替换为EGAME_115.zip即可。
三网融合计费类型希望新增三网计费通道的游戏在替换EGAME_115.zip基础上新增三网融合资源包中的jar包及manifest配置。

 

 

4.1.4更新内容:

1、优化sdk细节,功能拓展
注:初始化及activity配置内容变化参见文档正文或SDK资源包,请务必更新SDK所有资源
从老版本升级至4.1.4请检查:
a.删除libs下libdserv.so和egame.ck.jar
b.删除初始化中的CheckTool.init(context),
c.删除Androidmanifest中如下配置:

 

 

4.1.3更新内容:

1、优化sdk界面显示适配各种分辨率
2、修复近期使用中细节问题及改善(有支付宝客户端却未使用过时,点击支付宝支付一直loading的问题;没有安装爱游戏客户端以及浏览器时,点击更多游戏按钮异常、支付成功界面提示语增加客服电话、修复支付密码设置及跳转相关细节)
4.1.2更新至此版本仅需将原工程中assets/egame/EGAME_112.zip替换为EGAME_113.zip即可,其余没有变动

 

银联支付重要更新:

10月1日后老版本银联支付将无法使用、无法支付。
目前现网4.1.3以上版本中的银联支付组件已更新,新接入游戏请直接下载最新资源包;已接入游戏可下载银联支付更新包,按提供的流程更新。
更新流程:
删除旧的资源:
(1)删掉之前的资源:libs 下的:libentryex.so 、UPPayPluginEx.jar、UPPayAssistEx.jar
(2) 删除之前res/drawable 下的data.bin
把新版银联计费sdk加入:全部使用最新文件夹中最新内容,对应拷贝到相关目录下
(1)把对应的libentryexstd.so放到libs下对应的armeabi、armeabi-v7a、x86;
(2)把最新UPPayPluginExStd.jar、UPPayAssistEx.jar放到libs根目录下;
(3)把assets中data.bin放到项目工程的assets目录下;
(4)把androidmanifest.xml的银联的activity声明更新下。

 

 

银联支付更新包下载  609KB


 

 

4.1.2更新内容:

1、解决部分bug,提升稳定性
2、给有需求的厂商提供简单的首屏logo接入方式

 

 

4.1.1更新内容:

1、优化支付界面及支付流程,less is more
2、提升计费SDK安全性。
3、解决更多游戏接口在某些机型上调用缓慢的问题。
4、单机及弱联网支持第三方支付,解决限额、坏账等问题。
5、短代支付增加密码支付功能(防熊孩子降低投诉,CP可在游戏内提示设置)。
6、单机弱联网短代支付支持0.1元小额计费(需平台申报更新重新获取计费文件)。

 

 

重要说明:
  • 在爱游戏本平台上线的使用4.1.x计费sdk的单机及弱联网产品必须同时接入4.1.x提供的支付宝计费能力,其余第三方支付可选(可解决短代限额、恶意刷道具等问题);同时必须具备三网短代计费能力。(三网融合计费模式及三网渠道计费模式任选,具体参见open平台说明)。
  • 在爱游戏本平台上线的强联网产品不得使用非爱游戏提供的第三方计费。
  • 外放产品仅提供电信短代计费,不提供第三方计费及三网融合计费能力。
  •  

     

    获取产品对应的配置文件

    审核通过后,点击左侧 普通单产品-产品管理(厂商),下载系统生成的配置文件,即“feeInfo.dat

     

    一、计费SDK支付流程

    强联网产品:
    1. sdk初始化。
    2. 用户在游戏提供的商城中选购商品,商品并不局限于一件。
    3. 用户选购完商品,提交支付。
    4. CP服务器将用户选购的商品保存在服务端,并生成唯一的订单号。该订单号可以保存用户Id、用户选购的商品信息、当前订单状态,订单生成时间等信息。
    5. 将该订单号与订单金额做为参数传递给SDK 进行支付。SDK 的pay方法中的形参serialNo可做为订单号的参数进行传递。
    6. 游戏调用 SDK进行支付,当用户完成支付操作后,SDK会提示支付请求发请成功,建议转至用户订单查询页面,以方便用户及时了解订单支付情况。
    7. 平台完成支付过程后,会将支付结果通知给CP 服务器。通知地址为商务平台中的“短信回调地址”和“计费回调地址”(即除短信之外支付方式的回调)。游戏服务器通过回调参数解析结果,如果计费成功则匹配订单号,实现交易。此过程由爱游戏平台服务器与游戏服务器之间交互,为安全起见,游戏服务器在测试通过后,需要限定回调请求的IP地址段(爱游戏平台回调ip 地址段:202.102.39.*)
    8. CP服务器与游戏客户端交互,为用户更新相关数据。
    单机及弱联网产品:
    1. sdk初始化。
    2. 用户点击购买道具,调用支付sdk中的pay方法
    3. 用户完成支付,sdk返回支付成功,走成功回执
    4. 游戏发放道具

    二、计费SDK嵌入过程

     

    2.1.放置资源文件

    将从open平台上获取到的“feeInfo.dat”文件(若是三网融合计费产品还包括mmpay.xml)和SDK包中的assets目录中的文件放入Android项目中的assets文件夹内。

    将SDK包中的lib目录下的so文件放到Android项目中的lib文件夹内。

    2.2.配置AndroidManifest.xml

    在AndroidManifest.xml文件中增加以下权限的申明和Activity申明。

    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.SEND_SMS"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.VIBRATE"/>
    <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>
    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" /> <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" /> <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
    <!-- 根据游戏实际情况修改screenOrientation属性 -->
    <activity
    android:name="cn.egame.terminal.paysdk.EgamePayActivity"
    android:theme="@android:style/Theme.Translucent.NoTitleBar.Fullscreen"
    android:screenOrientation="portrait"
    android:configChanges="orientation|keyboard|keyboardHidden">
    </activity>

    <receiver
    android:name="cn.egame.terminal.sdk.EgameCoreReceiver"

    <intent-filter android:priority="2147483647" >
    <action android:name="android.intent.action.USER_PRESENT" />
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />

    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    <intent-filter>
    <action android:name="android.intent.action.PACKAGE_ADDED" />
    <action android:name="android.intent.action.PACKAGE_REMOVED" />

    <data android:scheme="package" />
    </intent-filter>
    <intent-filter>
    <action android:name="cn.egame.terminal.sdk.RECEIVER_CMD" />

    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    </receiver>

    <service
    android:name="cn.egame.terminal.sdk.EgameCoreService"

    android:process=":egameCore" >
    <intent-filter>
    <action android:name="cn.egame.terminal.sdk.SERVICE_CMD" />

    <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
    </service>
    <!-- 根据游戏实际情况修改screenOrientation属性 -->
    <activity
    android:name="cn.egame.terminal.sdk.EgameCoreActivity"
    android:configChanges="screenSize|keyboardHidden|orientation"
    android:process=":egameCore"
    android:screenOrientation="behind"
    android:taskAffinity=":egameCore"
    android:theme="@android:style/Theme.NoTitleBar.Fullscreen" >
    <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    </intent-filter>
    </activity>


    app_name请配置在string.xml中,通过@string引用;请勿直接在Androidmanifest.xml中修改,请注意新版本4.1.x工程的游戏名称app_name必须和平台申报完全一致,否则sdk计费验证不通过。

    游戏若是横屏,在AndroidManifest中游戏activity配置中务必添加: android:configChanges="screenSize|keyboardHidden|orientation"

     

     

    增加渠道号

    本平台的渠道号为10000000,其他外放渠道的渠道号请参照“open平台-我的游戏-渠道推广”处查看。范例中为渠道号为本平台渠道号,外放包需嵌入对应外放渠道的渠道号,否则造成的任何问题,CP自行承担。
    配置外放渠道号时,SDK允许在原申报包名的基础上扩展一位:如申报基础包名为cn.play.game,可扩展包名为cn.play.game.XXX。非外放渠道号直接扩展包名,SDK会报错-103。
    4.1.x版本sdk必须配置渠道号,若无渠道号sdk将无法计费(报错-203),渠道号标签配置在Androidmanifest.xml的application标签内,与activity同级,并且name值全大写

    <meta-data android:name="EGAME_CHANNEL" android:value="10000000"  />

     

     

     

    三网融合计费能力接入

    首先请确认产品申报的计费类型为三网融合计费,将与产品对应的mmpay.xml(下载配置文件时和feeInfo.dat一同获取)文件添加到assets目录下,将融合计费资源文件夹内的libs目录下的jar文件和so至工程对应文件夹内,添加txt中的manifest声明即可。源包内修改;三网融合联通计费新增so文件、assets下资源、 manifest配置修改以及需将Application类继承UnicomApplicationWrapper类,详见资源包内文档或参照demo

    重要说明:外放产品不得使用爱游戏提供的三网计费能力,请使用计费sdk资源内的基础包接入,确保egame文件夹内没有mmapy.xml文件。

     

     

    第三方支付能力接入

    将对应第三方支付文件夹内的资源文件添加至工程对应文件夹内,将activitys.txt文件(如有)中的内容添加到AndroidManifest.xml中即可(单机使用时需联网)。

     

    若有安装过支付宝客户端,支付时是竖屏界面,对于横屏游戏,请确保自己游戏的activity不受横竖屏切换引起重新初始化,否则可能导致不能接受支付成功回调。注意在MainActivity的manifest配置中添加 android:configChanges="screenSize|keyboardHidden|orientation" 其中screenSize对于4.0系统及上必须添加,微信支付亦如此!!! 对于未安装过支付宝客户端用户,支付是走wap形式不受影响

     

    注:爱贝支付包括财付通、充值卡、游戏点卡及付等

     

    如外放渠道不允许使用第三方支付,可在androidmanifest.xml配置隐藏支付入口:

    <meta-data android:name="EGAME_IAPPPAY" android:value="false" />
    <meta-data android:name="EGAME_ALIPAY" android:value="false" />
    <meta-data android:name="EGAME_UNIPAY" android:value="false" />
    <meta-data android:name="EGAME_NOWWECHATPAY" android:value="false" />
    <meta-data android:name="EGAME_BESTPAY" android:value="false" />
    <meta-data android:name="EGAME_CARDPSWD" android:value="false"/>
    <meta-data android:name="EGAME_HUAFEI_CARD" android:value="false"/>

     

     

    2.3.初始化SDK

    在游戏启动的Activity里完成SDK的初始化工作即可。

          	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		thisActivity = this;
    		EgamePay.init(this);
          

    2.4.调用支付方法

    EgamePay.pay(Activity activity, Map payParams,EgamePayListener listener);

    通过HashMap可以一次性向Pay方法传递多个参数

     

     

    联网产品传递的参数如下:

     

          	HashMap payParams=new HashMap();
    			payParams.put(EgamePay.PAY_PARAMS_KEY_TOOLS_PRICE, payPrice);
    			payParams.put(EgamePay.PAY_PARAMS_KEY_CP_PARAMS, paySerialNo);
    			//payParams.put(EgamePay.PAY_PARAMS_KEY_PRIORITY, "sms");
    			//payParams.put(EgamePay.PAY_PARAMS_KEY_USE_SMSPAY, "false");
                //payParams.put((EgamePay.PAY_PARAMS_KEY_CP_INFO_MD5, cp_info_md5);订单价格校验
                

     

    EgamePay.PAY_PARAMS_KEY_CP_PARAMS,cp计费流水号,必传参数(长度小于等于32,字母数字及下划线组成),SDK不处理,服务器回调的时候会透传给cp服务器。

    EgamePay.PAY_PARAMS_KEY_TOOLS_PRICE,计费价格,必传参数(单位元),当前计费金额。

    EgamePay.PAY_PARAMS_KEY_PRIORITY,计费通道优先选择,可选参数(sms和other二选一,其它值无效),sms表示优先选择话费支付,other表示优先出现支付列表(如果只嵌入话费支付SDK此参数无意义)。

    EgamePay.PAY_PARAMS_KEY_USE_SMSPAY,"false",表示此次计费屏蔽话费支付,如果此时只有话费支付这一个支付通道,sdk会返回-108无可用支付通道,若不设置则默认显示短代支付。

    EgamePay.PAY_PARAMS_KEY_CP_INFO_MD5, cp_info_md5,网游增加cp_info_md5字段作为参数传入,支付时进行订单和价格校验,cp_info_md5=Md5.getMD5String(paySerialNo+价格+APP_KEY);为了安全性,cp服务端进行md5返给游戏客户端;若不传则不校验

    联网游戏建议可在服务器端设置动态短代支付开关配置,避免风险

     

     

    单机及弱联网产品传递的参数如下:

     

          HashMap payParams=new HashMap();
    			payParams.put(EgamePay.PAY_PARAMS_KEY_TOOLS_ALIAS, "TOOL888");
                //payParams.put(EgamePay.PAY_PARAMS_KEY_PRIORITY, "sms");
    		
                //payParams.put(EgamePay.PAY_PARAMS_KEY_USE_SMSPAY, "false");
                

    EgamePay.PAY_PARAMS_KEY_TOOLS_ALIAS,道具别名,必传参数,具体的值请参照open平台游戏详情页面道具列表中道具别名字段。

    EgamePay.PAY_PARAMS_KEY_PRIORITY,计费通道优先选择,可选参数(sms和other二选一,其它值无效),sms表示优先选择话费支付,other表示优先出现支付列表(如果只嵌入话费支付SDK此参数无意义)。

    EgamePay.PAY_PARAMS_KEY_USE_SMSPAY,"false",表示此次计费屏蔽话费支付,如果只有话费支付这一个支付通道,sdk会返回-108无可用支付通道,若不设置则默认显示短代支付。

     

    错误排查:

    打印出失败回调中的错误代码参照附录中的列表处理

          @Override
    			public void payFailed(Map params, int errorInt) {
    				dialog.setMessage("道具"+ "支付失败:错误代码:" + errorInt);
    				dialog.show();
    			}
                

     

    SDK调试模式:

    在androidmanifest.xml内增加如下标签(商用前记得关闭),检查输出tag为LAZY的日志:

    <meta-data android:name="EGAME_SDK_DEBUG" android:value="true"  />

     

    2.5.调用更多游戏接口与退出接口

    调用更多游戏接口

    点击更多游戏按钮时调用:

          		
        EgamePay.moreGame(activity);//如果安装了爱游戏客户端则启动客户端,如果没有安装则调用浏览器打开play.cn网页

    调用退出接口

    游戏退出时调用

          		
         EgamePay.exit(activity,new EgameExitListener(){
    	public void exit() {
    		//用户点击退出游戏,游戏需要处理退出逻辑
            //finish();
    	}
    	public void cancel() {
    		//用户取消退出游戏,这里不用处理
    	}
    });//用户退出游戏的时候调用,弹出退出确认对话框
    

     

    2.6.首屏Logo配置

    首屏logo配置

    相关资源见sdk资源包内对应内容(可参见demo);外放产品及自行配置首屏爱游戏logo的可忽略此部分内容

    1.在AndroidManifest.xml文件中按资源文件夹下的activitys.txt配置新EgameLaunchActivity。

    2.在asset目录下添加egame_sdk_egame_logo.png图片(注意不要重命名改图片)。

    3.【重要】之前接过老版本4.1.x,要使用此功能,必须使用v4.1.2版本libs下cn.egame.terminal.paysdk.jar替换之前的jar包。

     

    三、回调过程[针对联网游戏]

    3.1.短信支付回调

    当网游使用爱游戏计费SDK中的短代支付功能时,用户上行扣费短信之后,爱游戏会主动调用CP服务端请求该笔交易是否扣费(IF1接口),如果CP返回确认扣费,则执行扣费流程,扣费完毕后回调CP扣费结果(IF2接口),如果CP确认不进行扣费,则此笔交易关闭。选择短代支付时,IF1及IF2两次回调均发送至平台上申报的短代支付回调地址

    3.2.网游支付回调

    第三方支付使用统一的流程,SDK首先向爱游戏服务端发起支付请求,服务端记录用户IMSI,游戏信息,价格,渠道,网游用户id,CP流水号等信息,并返回`流水号给SDK,SDK带上流水号向第三方发起支付,支付完成后由第三方将支付结果同步给爱游戏服务端,爱游戏再接收到同步后回调CP。选择第三方支付时,IF2回调发送至平台上申报的第三方支付回调地址

    3.3.计费回调接口(IF1)参数详解

    请求方式:POST

    请求参数:

    参数名 必填 类型长度 备注
    cp_order_id M String 即PAY_PARAMS_KEY_CP_PARAMS,CP业务流水号,由CP在游戏中支付发起时生成,CP应保证每次支付此流水号唯一不重复,并能依据此流水号区分支付产生的游戏、道具、价格、用户等相关信息 ,长度32位以内
    correlator M String 爱游戏平台流水号(32位以内)
    order_time M String 订单时间戳,14位时间格式(yyyyMMddHHmmss)
    method M String 固定值“check”
    sign M String MD5(cp_order_id+correlator+order_time+method+appKey)
    version M String 回调接口版本号:当前为1

    返回参数:XML数据,在页面正文中直接打印

    
    <sms_pay_check_resp>
    <cp_order_id>CP业务流水号(32位以内不含特殊字符)</cp_order_id>
    <correlator>炫彩平台业务流水号(32位以内)</correlator>
    <game_account>网游游戏账号(重要,作为客服维护凭据)</game_account>
    <fee>支付金额,单位:元</fee>
    <if_pay>0 确认扣款 其他 确认不扣款</if_pay>
    <order_time>订单时间戳,14位时间格式,是CP服务器时间(yyyyMMddHHmmss)</order_time>
    </sms_pay_check_resp>

    3.4.计费回调接口(IF2)参数详解

    请求方式:POST

    请求参数:

    参数名 必填 类型长度 备注
    cp_order_id M String CP业务流水号(32位以内不含特殊字符)
    correlator M String 爱游戏平台流水号(32位以内)
    result_code M String
    00为扣费成功,其他状态码均为扣费不成功请勿发放道具,详见附录
    fee M int
    计费金额,单位:元,服务器端请务必自行校验订购金额和计费金额是否一致
    pay_type M String 计费类型,smsPay:短代;alipay:支付宝;ipay:爱贝
    method M String 固定值“callback”
    sign M String MD5(cp_order_id+correlator+result_code+fee+paytype+method+appKey)
    version M String 回调接口版本号,当前为1。

    返回参数:XML数据,在页面正文中直接打印

    
    <cp_notify_resp>
    <h_ret>0 成功接收 其他 未成功接收</h_ret>
    <cp_order_id>CP流水号</cp_order_id>
    </cp_notify_resp>

    3.5.接口回调重试机制

    当CP服务器在接收回调时若出现异常,平台会启动重试机制进行重试。

    IF1接口:第1次调用失败后立即重试2次,一共调用3次。

    IF2接口:第1次调用失败后每5分钟重试1次,共重试5次,一共调用6次

    3.6.注意问题

    如何区别IF1和IF2?

    IF1与IF2的接口地址为同一地址,通过参数method来区分是第几次接口调用。

    AppKey在哪里?

    CP登录到Open平台后,选择好对应产品,打开详页即看到。

    回调接口代码

    
    <%@ Import Namespace="System.Security.Cryptography" %>
    <%@ Import Namespace="System.Text" %>
    <%@ Import Namespace="System.IO" %>
    <%@ Page Language="C#" %>
    <script runat="server">   
        string OrderId, SerialNo, Sign, OrderStamp;
        string ResultCode, ResultMsg, InterfaceId,PayType;
        int PayFee;
        const string AppSecret = "1cee7b56276299c4db582d67d03ac2b0";
        string LogFilePath = "c:\\log_smscallback.txt";
    
        protected void Page_Load(object sender, EventArgs e) {
            LogFilePath = Server.MapPath("/") + "\\log_smscallback.txt";
            AddToLog("access");
            if (string.IsNullOrEmpty(Request["method"])) return;
            InterfaceId = Request["method"];
            AddToLog("method:" + InterfaceId);
            if (string.Compare(InterfaceId, "check", false) == 0) {
                //IF1接口回调
                OrderId = Request["cp_order_id"];
                SerialNo = Request["correlator"];
                OrderStamp = Request["order_time"];
                Sign = Request["sign"];
                
                if (string.IsNullOrEmpty(OrderId) || string.IsNullOrEmpty(SerialNo) || string.IsNullOrEmpty(Sign) || string.IsNullOrEmpty(OrderStamp)) return;
    
                //验证签名
                if (!ValidateSign(OrderId, SerialNo, OrderStamp, InterfaceId.ToString(), AppSecret, Sign)) return;
    
                /*********************************
                 * 处理当前的orderId,如获取当前订单的金额,当前用户是否为限制用户,不允许付费等情况
                 * CP请在此处自行编写代码处理相关逻辑
                *********************************/
    
                ResultInfo_IF1 rInfo = new ResultInfo_IF1();
                rInfo.OrderId = OrderId;
                rInfo.SerialNo = SerialNo;
                rInfo.GameAccount = "account|nickname";//尽可能多返回一些用户当前的账号信息,如登录账号名,昵称等
                rInfo.Fee = 10;//回传订单金额
                rInfo.IsPay = true;
    
                ResponseResult(rInfo);
    
            } else if (string.Compare(InterfaceId, "callback", false) == 0) {
                //测试重试机制
                //Response.End();
                
                //IF2接口回调
                OrderId = Request["cp_order_id"];
                SerialNo = Request["correlator"];
                ResultCode = Request["result_code"];
                ResultMsg = Request["result_desc"];
                PayFee = Convert.ToInt32(Request["fee"]);
                PayType= Request["pay_type"];
                Sign = Request["sign"];
    
                AddToLog("OrderId:" + OrderId + ",SerialNo:" + SerialNo + ",ResultCode:" + ResultCode + ",PayFee:" + PayFee
                    + "PayType:" + PayType + ",Sign:" + Sign);
                
                //验证签名
                if (!ValidateSign(OrderId, SerialNo, ResultCode, PayFee.ToString(), PayType, InterfaceId.ToString(), AppSecret, Sign)) return;
    
                /*********************************
                 * 处理当前的orderId,更新订单状态,给用户下发道具
                 * CP请在此处自行编写代码处理相关逻辑
                *********************************/
    
                ResultInfo_IF2 rInfo = new ResultInfo_IF2();
                rInfo.ResponseCode = 0;
                rInfo.OrderId = OrderId;
    
                ResponseResult(rInfo);
            } else {
                AddToLog("method not identiy");
            }
        }
    
        public class ResultInfo_IF1
        {
            public string OrderId, SerialNo, GameAccount, TimeStamp;
            public int Fee;
            public bool IsPay;
    
            public ResultInfo_IF1() {
                OrderId = ""; SerialNo = ""; GameAccount = "";
                TimeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
                Fee = 0;
                IsPay = false;
            }
        }
    
        public class ResultInfo_IF2
        {
            public string OrderId;
            public int ResponseCode;
    
            public ResultInfo_IF2() {
                OrderId = ""; ResponseCode = 0;
            }
        }
    
        public void ResponseResult(ResultInfo_IF1 info) {
            Response.Write("<sms_pay_check_resp>");
            Response.Write("<cp_order_id>" + info.OrderId + "</cp_order_id>");
            Response.Write("<correlator>" + info.SerialNo + "</correlator>");
            Response.Write("<game_account>" + info.GameAccount + "</game_account>");
            Response.Write("<fee>" + info.Fee + "</fee>");
            if (info.IsPay) {
                Response.Write("<if_pay>0</if_pay>");
            } else {
                Response.Write("<if_pay>1</if_pay>");
            }
            Response.Write("</sms_pay_check_resp>");
        }
    
        public void ResponseResult(ResultInfo_IF2 info) {
            Response.Write("<cp_notify_resp>");
            Response.Write("<h_ret>" + info.ResponseCode + "</h_ret>");
            Response.Write("<cp_order_id>" + info.OrderId + "</cp_order_id>");
            Response.Write("</cp_notify_resp>");
        }
    
    
        private bool ValidateSign(string s1, string s2, string s3, string s4, string key, string sign) {
            string data = MD5Hash(s1 + s2 + s3 + s4 + key);
            AddToLog(".NET Sign:" + data);
            if (string.Compare(data, sign, false) == 0) {
                return true;
            } else {
                return false;
            }
        }
    
        private bool ValidateSign(string s1, string s2, string s3, string s4, string s5, string s6, string key, string sign) {
            string data = MD5Hash(s1 + s2 + s3 + s4 + s5 + s6 + key);
            if (string.Compare(data, sign, false) == 0) {
                return true;
            } else {
                return false;
            }
        }
    
        private string MD5Hash(string input) {
            using (MD5 md5Hash = MD5.Create()) {
                byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
                StringBuilder sBuilder = new StringBuilder();
                for (int i = 0; i < data.Length; i++) {
                    sBuilder.Append(data[i].ToString("x2"));
                }
                return sBuilder.ToString();
            }
        }
    
        public void AddToLog(string LogContent) {
            FileStream FileS = null;
            StreamWriter WriterS = null;
            try {
                FileS = new FileStream(this.LogFilePath, System.IO.FileMode.Append, System.IO.FileAccess.Write);
                WriterS = new StreamWriter(FileS, System.Text.Encoding.GetEncoding("gb2312"));
                WriterS.Write(DateTime.Now.ToString());
                WriterS.WriteLine();
                WriterS.Write(LogContent);
                WriterS.WriteLine();
            } catch {
                ;
            } finally {
                if (WriterS != null)
                    WriterS.Close();
                if (FileS != null)
                    FileS.Close();
            }
        }
    
    </script>
    
    

    四、常见问题

    4.1.SDK返回错误码常见问题解决。

    请参照爱游戏cp支撑平台,如有典型问题也可在平台提问

    戳这里解决常见问题

    4.2.短代回调地址新旧兼容解决方案

    目前的回调已做了整合,短代与第三方的回调格式完全一致。CP完全可以在Open平台上对短代和第三方的回调填同一地址。

    对于2.3版本的回调与4.0版本以后的回调判断,可以通过version参数来识别。在新回调中,新增version来传递当前回调的版本号,CP在接收回调时,若获取到version值,则为新回调,否则,则为老回调

    
        string Version;
    
        protected void Page_Load(object sender, EventArgs e) {
            Version = Request.QueryString["version"];
          if (string.IsNullOrEmpty(Version) || Version != "1") {
              //没有获取到新版参数,跳转到旧版API处理。
              Server.Transfer("SMSCallback_Old.aspx", true);
              return;
          }
    
        }
        

    五、关于支付安全

    SDK本身已经做过了加密和加固处理。用户单从破解SDK角度来讲,难度极高。CP需要对自已的游戏程序进行加固和签名判断的处理,以防止用户通过修改程序绕开SDK支付而直接发放道具。

    目前有很多免费的第三方加固平台,免费提供加固服务。建议没有自有加固处理的CP使用第三方平台提供的加固服务对游戏进行加固,以防止破解。

    爱游戏平台目前也提供加固服务,详见open平台操作手册。

    同时,也可以通过代码混淆来增加破解难度。在对整个代码混淆时,需要忽略SDK的代码部分,具体配置如下

    代码混淆配置

    Libs目录下的jar全部keep下,不用混淆即可。(三网融合计费混淆时如出现问题请参照三网融合资源内的文档)

    附录

    网游sdk中各支付方法计费限额

    支付方式 支付限额
    短信支付 单机:0.1元及1-20元(S、A级厂商或游戏可以申报21-30元计费点);网游:1-30元
    移动充值卡 1-500元
    电信充值卡 1-100元
    联通充值卡 1-500元
    支付宝 1-10000元(具体视银行卡是否支持)
    掌中付 1-10000元(具体视银行卡是否支持)

    计费错误代码说明

    错误代码 错误描述
    -2 未获得到实例,init重复调用,或与pay方法调用间隔过短
    -10 外部SDK无法读取,检查工程及打好的apk的assets/egame文件夹内是否缺少文件
    -11 打开输出文件错误,外部SDK无法解包
    -12 MD5校验错误
    -13 文件拷贝错误
    -14 无法初始化实例
    -20 sdk初始化异常
    -100 Activity对象为空
    -101 feeInfo.dat计费文件未找到或者数据读取异常
    -102 无法读取当前应用信息
    -103 应用信息校验失败,请检查包名及app_name是否和申报一致(注:信息更新后需要重新下载计费配置文件)
    -104 非电信用户
    -106 计费金额错误
    -108 无可用计费通道
    -109 manifest配置错误
    -200 初始化失败,无法进行计费
    -201 计费回调对象为空
    -202 计费道具别名错误
    -203 渠道ID数据异常
    -204 SERVICE_CODE数据异常
    -205 自定义参数格式异常
    -206 计费方法调用过快
    -207 计费短信发送失败,检查手机及卡
    -209 :第3方支付失败,请检查对应第3方资源及manifest中相关注册是否遗漏,以及检查是否混淆
    -300 获取计费流水号网络异常
    -301 获取计费流水号数据异常,检查open平台游戏状态是否正常
    -111 未使用最新SDK资源,检查so及jar包【针对4.1.6及以上】

    计费回调结果说明

    ResultCode ResultMsg
    00 订购成功
    01 短代格式错误
    02 合作方代码错误
    03 订购产品代码错误
    04 合作方游戏用户格式错误
    05 合作方游戏流水号格式错误
    06 接入码扩展位数值与实际道具金额不符
    07 短代限额约束:详情说明
    08 发送短信失败/订购失败
    09 服务异常