游戏微信支付成功返回参数出现微信支付成功返回参数参数为空怎么处理

后使用快捷导航没有帐号?
今日: 14主题: 22434
查看: 530|回复: 7
阅读权限50最后登录帖子精华0积分781注册时间
老虎军士长, 积分 781, 距离下一级还需 219 积分
帖子精华0银币1518 在线时间55 小时注册时间
本帖最后由 Mr丶吴先生 于
13:33 编辑
从昨天开始到现在就开始充值无法充,请处理。
10:00 上传
阅读权限150最后登录帖子精华0积分14596注册时间
帖子精华0银币18786 在线时间1954 小时注册时间
楼主大大早上好哟O(∩_∩)O~从亲的截图看,大大是IOS APP客户端的玩家,麻烦亲确认一下是否成功扣款,如果没被扣款,不排除是点击充值跳转到itunes进行支付的时候,与itunes连接上出现了异常(比如当前网络不稳定),然后连接苹果itunes服务器就会出现支付异常的情况,这种建议将当前网络模式切换成另外的模式再尝试进游戏进行支付哟O(∩_∩)O~
阅读权限50最后登录帖子精华0积分781注册时间
老虎军士长, 积分 781, 距离下一级还需 219 积分
帖子精华0银币1518 在线时间55 小时注册时间
叶子孽障 发表于
楼主大大早上好哟O(∩_∩)O~从亲的截图看,大大是IOS APP客户端的玩家,麻烦亲确认一下是否成功扣款,如果 ...
我现在网络是用wif,刚刚试过了,还是支付失败呀……
阅读权限150最后登录帖子精华0积分6326注册时间
帖子精华0银币8946 在线时间1719 小时注册时间
楼主大大您好O(∩_∩)O~~很高兴能为您服务。
楼主大大还请您不要着急,根据您的截图信息提示,不排除是因为您当时在需要输入APP账号密码的时候点击了取消或者是当时的网络不好导致的,建议您可以在充值的时候更换成稳定的网络,并且及时输入APP账号密码哦~如果还是不行,您也可以更换设备或时间段重新尝试一下。
阅读权限50最后登录帖子精华0积分781注册时间
老虎军士长, 积分 781, 距离下一级还需 219 积分
帖子精华0银币1518 在线时间55 小时注册时间
彤小沫 发表于
楼主大大您好O(∩_∩)O~~很高兴能为您服务。
楼主大大还请您不要着急,根据您的截图信息提示,不排除是因为 ...
都试过了,还是支付失败。密码都对的呀……
阅读权限150最后登录帖子精华0积分15230注册时间
帖子精华0银币18549 在线时间1862 小时注册时间
楼主大大您好,很高兴为您服务。还请您查看您的APP账户是否还有余额哦,谢谢。
阅读权限50最后登录帖子精华0积分781注册时间
老虎军士长, 积分 781, 距离下一级还需 219 积分
帖子精华0银币1518 在线时间55 小时注册时间
Mr丶吴先生 发表于
楼主大大您好,很高兴为您服务。还请您查看您的APP账户是否还有余额哦,谢谢。 ...
有余额。还有75元充30元总够了吧……麻烦快点处理
阅读权限150最后登录帖子精华0积分15230注册时间
帖子精华0银币18549 在线时间1862 小时注册时间
好的,请您提供下面信息帮提交核实哦:
苹果账号:
账号余额截图:
充值信息确认提示截图:
无标题文档
Powered by
Comsenz Inc.爱游戏计费SDK支付嵌入文档
支付SDK嵌入文档
当前版本:v4.2.5(
released )
最后更新于
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声明更新下。
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支付流程
强联网产品:
sdk初始化。
用户在游戏提供的商城中选购商品,商品并不局限于一件。
用户选购完商品,提交支付。
CP服务器将用户选购的商品保存在服务端,并生成唯一的订单号。该订单号可以保存用户Id、用户选购的商品信息、当前订单状态,订单生成时间等信息。
将该订单号与订单金额做为参数传递给SDK 进行支付。SDK 的pay方法中的形参serialNo可做为订单号的参数进行传递。
游戏调用 SDK进行支付,当用户完成支付操作后,SDK会提示支付请求发请成功,建议转至用户订单查询页面,以方便用户及时了解订单支付情况。
平台完成支付过程后,会将支付结果通知给CP 服务器。通知地址为商务平台中的“短信回调地址”和“计费回调地址”(即除短信之外支付方式的回调)。游戏服务器通过回调参数解析结果,如果计费成功则匹配订单号,实现交易。此过程由爱游戏平台服务器与游戏服务器之间交互,为安全起见,游戏服务器在测试通过后,需要限定回调请求的IP地址段(爱游戏平台回调ip 地址段:202.102.39.*)
CP服务器与游戏客户端交互,为用户更新相关数据。
单机及弱联网产品:
sdk初始化。
用户点击购买道具,调用支付sdk中的pay方法
用户完成支付,sdk返回支付成功,走成功回执
游戏发放道具
二、计费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& /&&!-- 根据游戏实际情况修改screenOrientation属性 --&
android:name=&cn.egame.terminal.paysdk.EgamePayActivity&
android:theme=&@android:style/Theme.Translucent.NoTitleBar.Fullscreen&
android:screenOrientation=&portrait&
android:configChanges=&orientation|keyboard|keyboardHidden&&
&/activity&
android:name=&cn.egame.terminal.sdk.EgameCoreReceiver&
&intent-filter android:priority=&& &
&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&
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属性 --&
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"
增加渠道号
本平台的渠道号为,其他外放渠道的渠道号请参照“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=&&
三网融合计费能力接入
首先请确认产品申报的计费类型为三网融合计费,将与产品对应的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的初始化工作即可。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
thisActivity =
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无可用支付通道,若不设置则默认显示短代支付。
错误排查:
打印出失败回调中的错误代码参照附录中的列表处理
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);//如果安装了爱游戏客户端则启动客户端,如果没有安装则调用浏览器打开网页
调用退出接口
游戏退出时调用
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
即PAY_PARAMS_KEY_CP_PARAMS,CP业务流水号,由CP在游戏中支付发起时生成,CP应保证每次支付此流水号唯一不重复,并能依据此流水号区分支付产生的游戏、道具、价格、用户等相关信息 ,长度32位以内
correlator
爱游戏平台流水号(32位以内)
order_time
订单时间戳,14位时间格式(yyyyMMddHHmmss)
固定值&check&
MD5(cp_order_id+correlator+order_time+method+appKey)
回调接口版本号:当前为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
CP业务流水号(32位以内不含特殊字符)
correlator
爱游戏平台流水号(32位以内)
result_code
00为扣费成功,其他状态码均为扣费不成功请勿发放道具,详见附录
计费金额,单位:元,服务器端请务必自行校验订购金额和计费金额是否一致
计费类型,smsPay:短代;alipay:支付宝;ipay:爱贝
固定值&callback&
MD5(cp_order_id+correlator+result_code+fee+paytype+method+appKey)
回调接口版本号,当前为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, OrderS
string ResultCode, ResultMsg, InterfaceId,PayT
const string AppSecret = "1cee7bdb582d67d03ac2b0";
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"]))
InterfaceId = Request["method"];
AddToLog("method:" + InterfaceId);
if (pare(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))
//验证签名
if (!ValidateSign(OrderId, SerialNo, OrderStamp, InterfaceId.ToString(), AppSecret, Sign))
/*********************************
* 处理当前的orderId,如获取当前订单的金额,当前用户是否为限制用户,不允许付费等情况
* CP请在此处自行编写代码处理相关逻辑
*********************************/
ResultInfo_IF1 rInfo = new ResultInfo_IF1();
rInfo.OrderId = OrderId;
rInfo.SerialNo = SerialNo;
rInfo.GameAccount = "account|nickname";//尽可能多返回一些用户当前的账号信息,如登录账号名,昵称等
rInfo.Fee = 10;//回传订单金额
rInfo.IsPay =
ResponseResult(rInfo);
} else if (pare(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))
/*********************************
* 处理当前的orderId,更新订单状态,给用户下发道具
* CP请在此处自行编写代码处理相关逻辑
*********************************/
ResultInfo_IF2 rInfo = new ResultInfo_IF2();
rInfo.ResponseCode = 0;
rInfo.OrderId = OrderId;
ResponseResult(rInfo);
AddToLog("method not identiy");
public class ResultInfo_IF1
public string OrderId, SerialNo, GameAccount, TimeS
public int F
public bool IsP
public ResultInfo_IF1() {
OrderId = ""; SerialNo = ""; GameAccount = "";
TimeStamp = DateTime.Now.ToString("yyyyMMddHHmmss");
public class ResultInfo_IF2
public string OrderId;
public int ResponseC
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&");
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 (pare(data, sign, false) == 0) {
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 (pare(data, sign, false) == 0) {
private string MD5Hash(string input) {
using (MD5 md5Hash = MD5.Create()) {
byte[] data = puteHash(Encoding.UTF8.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i & data.L i++) {
sBuilder.Append(data[i].ToString("x2"));
return sBuilder.ToString();
public void AddToLog(string LogContent) {
FileStream FileS =
StreamWriter WriterS =
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();
} finally {
if (WriterS != null)
WriterS.Close();
if (FileS != null)
FileS.Close();
四、常见问题
4.1.SDK返回错误码常见问题解决。
请参照爱游戏cp支撑平台,如有典型问题也可在平台提问
4.2.短代回调地址新旧兼容解决方案
目前的回调已做了整合,短代与第三方的回调格式完全一致。CP完全可以在Open平台上对短代和第三方的回调填同一地址。
对于2.3版本的回调与4.0版本以后的回调判断,可以通过version参数来识别。在新回调中,新增version来传递当前回调的版本号,CP在接收回调时,若获取到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);
五、关于支付安全
SDK本身已经做过了加密和加固处理。用户单从破解SDK角度来讲,难度极高。CP需要对自已的游戏程序进行加固和签名判断的处理,以防止用户通过修改程序绕开SDK支付而直接发放道具。
目前有很多免费的第三方加固平台,免费提供加固服务。建议没有自有加固处理的CP使用第三方平台提供的加固服务对游戏进行加固,以防止破解。
爱游戏平台目前也提供加固服务,详见open平台操作手册。
同时,也可以通过代码混淆来增加破解难度。在对整个代码混淆时,需要忽略SDK的代码部分,具体配置如下
代码混淆配置
Libs目录下的jar全部keep下,不用混淆即可。(三网融合计费混淆时如出现问题请参照三网融合资源内的文档)
网游sdk中各支付方法计费限额
单机:0.1元及1-20元(S、A级厂商或游戏可以申报21-30元计费点);网游:1-30元
移动充值卡
电信充值卡
联通充值卡
1-10000元(具体视银行卡是否支持)
1-10000元(具体视银行卡是否支持)
计费错误代码说明
未获得到实例,init重复调用,或与pay方法调用间隔过短
外部SDK无法读取,检查工程及打好的apk的assets/egame文件夹内是否缺少文件
打开输出文件错误,外部SDK无法解包
MD5校验错误
文件拷贝错误
无法初始化实例
sdk初始化异常
Activity对象为空
feeInfo.dat计费文件未找到或者数据读取异常
无法读取当前应用信息
应用信息校验失败,请检查包名及app_name是否和申报一致(注:信息更新后需要重新下载计费配置文件)
非电信用户
计费金额错误
无可用计费通道
manifest配置错误
初始化失败,无法进行计费
计费回调对象为空
计费道具别名错误
渠道ID数据异常
SERVICE_CODE数据异常
自定义参数格式异常
计费方法调用过快
计费短信发送失败,检查手机及卡
:第3方支付失败,请检查对应第3方资源及manifest中相关注册是否遗漏,以及检查是否混淆
获取计费流水号网络异常
获取计费流水号数据异常,检查open平台游戏状态是否正常
未使用最新SDK资源,检查so及jar包【针对4.1.6及以上】
计费回调结果说明
ResultCode
短代格式错误
合作方代码错误
订购产品代码错误
合作方游戏用户格式错误
合作方游戏流水号格式错误
接入码扩展位数值与实际道具金额不符
短代限额约束:详情说明
发送短信失败/订购失败

我要回帖

更多关于 微信支付回调参数获取 的文章

 

随机推荐