教你快速高效接入SDK——服务器端支付回调的处理方式

今天着重把之前渠道服务器端SDK的时候,遇到的一个蛋疼的问题给解决了。

按照之前我们搭建U8Server的思路,U8Server是可以完美支持多款游戏的。包括登录认证和支付回调。登录认证,没啥好说的。统一的接口即可,和客户端的协议对应上。支付回调呢?各个渠道的支付回调逻辑,对于每款游戏来说都是一样的,然后每个游戏填写的登录回调地址,也都一样。

U8Server采用J2EE成熟框架实现,各个游戏的各个渠道的参数,是配置在数据库中,通过后台管理工具来完成添加,修改,删掉等操作。

之前我们的流程,相信大家还记得。客户端在调用支付接口之前,首先会来U8Server获取一个订单号。这个时候,U8Server会在订单数据表中记录一条数据,然后将生成的订单号,返回给客户端。客户端将该订单号放在渠道SDK的扩展字段或者固定订单号字段中传到SDK服务器。SDK服务器支付完成,回调到U8Server的时候,会将这个订单号原封不动的返回。

这个时候,在每个渠道的支付回调方法中,我们首先获取到渠道SDK返回的参数中的订单号。然后根据该订单号来查找数据库中对应的订单信息,进而获取到当前支付的用户信息,渠道信息,游戏信息等相关联的数据

这种方式,对于多数渠道来说,是OK的。但是在接安智和ITools的时候,我们发现,这些渠道在支付回调的时候,把所有的数据都进行了加密处理,支付回调方法中,拿到这个参数无法直接获取到订单号,需要先拿到该渠道对应的解密密钥来对该加密过的参数进行解密,然后才能取到订单号等信息。

这就和我们之前的方式,就有冲突了。

我们是先解析参数,然后通过订单号,获取到渠道数据,再从渠道数据中获取当前渠道的配置数据(就是上面的解密密钥)。

但是现在这两个渠道是要求,我们先解密,再获取订单号。但是,解密需要的密钥,我们根本拿不到。因为我们是通过订单号获取渠道数据的。

后来想了想,能否通过URL地址,就直接获取到渠道号。比如,之前UC渠道,我们的支付回调地址是这样的:

http://192.168.1.88:8080/uc/payCallback

那么,现在,我们在配置渠道支付回调地址的时候,加上渠道号(比如当前游戏对应UC的渠道号为10):

http://192.168.1.88:8080/uc/payCallback/10

然后,在解析该URL地址的时候,我们需要通过某种方式,做一个URL重写。把类似的URL,给重写成如下形式:

http://192.168.1.88:8080/uc/payCallback?u8ChannelID=10

这样,我们就可以在UC渠道的支付回调方法payCallback中,直接获取到u8ChannelID=10.然后,就可以直接获取到渠道数据,进而获取到对应的配置数据。

好在,这种方式是完全可行的。我们采用J2EE(SSH2框架)来实现的U8Server,只需要再集成一个Tuckey UrlRewriteFilter 即可完成这样的URL重写。

关于该插件的使用很简单,网站上说明很详细,就不多说了。这里仅仅注意两点:

1、在web.xml中配置UrlRewriteFilter的时候,将其配置在struts2的Filter之前,否则URL重写无效

2、在struts2的filter-mapping中加上dispatcher的申明:

<dispatcher>REQUEST</dispatcher>

<dispatcher>FORWARD</dispatcher>

然后,在urlrewrite.xml中配置我们需要的重写规则正则表达式即可:

<rule>

<from>^/(.*)/payCallback/([0-9]+)</from>

<to>/$1/payCallback?u8ChannelID=$2</to>

</rule>

现在访问这些地址:

http://192.168.1.88:8080/uc/payCallback/10

http://192.168.1.88:8080/downjoy/payCallback/11

http://192.168.1.88:8080/anzhi/payCallback/39

都会变成如下形式:

http://192.168.1.88:8080/uc/payCallback?u8ChannelID=10

http://192.168.1.88:8080/downjoy/payCallback?u8ChannelID=11

http://192.168.1.88:8080/anzhi/payCallback?u8ChannelID=39

这样,所有渠道的支付回调地址就统一了,全部为如下形式:

http://{host}/{channel}/payCallback/{channelID}

在这里,顺便说一句。之前和很多童鞋的沟通交流中发现,%80以上的客户端的SDK接入同学,都只关注SDK客户端的接入,对服务器端的接入,一无所知,也不愿意着手去思考和研究。

虽然,可能服务器端不需要你去做,但是了解一下服务器端的接入原理,对SDK接入来说,可以培养起很好的大局观。SDK接入本身并不难,但是要做到高效,简洁,易于扩展和维护还是需要花费些心思的。(之前朋友所在的游戏公司招聘专门负责SDK接入的技术总监,月薪30K,你扪心自问,能够胜任吗?)

希望这些从事SDK接入的同学能够早日明白这一点。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2025-01-23 12:35:23

教你快速高效接入SDK——服务器端支付回调的处理方式的相关文章

教你快速高效接入SDK——渠道SDK的接入(就是实现抽象层的接口而已)

题记:很多做游戏开发的人,估计都或多或少地接过渠道SDK,什么UC,当乐,91,小米,360......据统计国内市场当前不下于100家渠道,还包括一些没有SDK的小渠道.每个渠道SDK接入的方法呢,多是大同小异.但是,正是这些小异,又让SDK的接入,产生了无穷无尽的变数.所以,接入SDK之前,如果你没有经验,或者没有被SDK坑过,那么当你看到这系列文章的时候,你很幸运,你可以避免这一切了.如果你之前被坑过,而且还在继续被坑着,那么现在,就是你解脱的时刻. 先将之前的每一篇做个索引,方便亲们查阅

教你快速高效接入SDK——SDK接入抽象层的设计

题记:很多做游戏开发的人,估计都或多或少地接过渠道SDK,什么UC,当乐,91,小米,360......据统计国内市场当前不下于100家渠道,还包括一些没有SDK的小渠道.每个渠道SDK接入的方法呢,多是大同小异.但是,正是这些小异,又让SDK的接入,产生了无穷无尽的变数.所以,接入SDK之前,如果你没有经验,或者没有被SDK坑过,那么当你看到这系列文章的时候,你很幸运,你可以避免这一切了.如果你之前被坑过,而且还在继续被坑着,那么现在,就是你解脱的时刻. 上一篇文章,我们总体地分析并设计了一套

教你快速高效接入SDK——总体思路和架构

题记:很多做游戏开发的人,估计都或多或少地接过渠道SDK,什么UC,当乐,91,小米,360......据统计国内市场当前不下于100家渠道,还包括一些没有SDK的小渠道.每个渠道SDK接入的方法呢,多是大同小异.但是,正是这些小异,又让SDK的接入,产生了无穷无尽的变数.所以,接入SDK之前,如果你没有经验,或者没有被SDK坑过,那么当你看到这系列文章的时候,你很幸运,你可以避免这一切了.如果你之前被坑过,而且还在继续被坑着,那么现在,就是你解脱的时刻. 完成一个SDK的接入并没有多少技术含量

教你快速高效接入SDK——统一sdk服务器的实现

U8Server是采用J2EE框架SSH2实现的.当然你也可以采用任何其他你熟悉的语言实现.上一篇文章中,我们从类的抽象中,大致梳理了一下U8Server所要完成的工作.大的方向上,U8Server需要实现统一的用户登录认证,和支付中心两大功能.更深入的细节,U8Server需要完成以下功能: 游戏管理:查询游戏,创建游戏(同时生成游戏的唯一appID,appKey等),编辑游戏,删除游戏等功能. 渠道商管理:查询渠道商,创建渠道商(设置该渠道商对应的登陆认证地址,支付回调地址等操作.),编辑渠

教你快速高效接入SDK——U8Server的初步分析

在U8SDK整套框架总体架构那篇文章,我们就给出了服务器端的解决方案,为此,我们加入了一个U8Server,来作为U8SDK整套框架的服务器端的统一用户认证中心和支付中心.那么,为了方便,我们这里再来引用一下登陆认证的流程图: 回顾下我们之前的分析,U8Server作为统一的登陆认证中心,针对的是多款游戏,那么每款游戏在接入SDK之前,就需要向U8Server申请一个AppID以及AppKey.这样,申请的过程,也就是在U8 Server中加入一条该游戏的数据记录.接下来,游戏需要配置每一个第三

教你快速高效接入SDK——游戏接入SDK(只接入抽象框架)

题记:很多做游戏开发的人,估计都或多或少地接过渠道SDK,什么UC,当乐,91,小米,360......据统计国内市场当前不下于100家渠道,还包括一些没有SDK的小渠道.每个渠道SDK接入的方法呢,多是大同小异.但是,正是这些小异,又让SDK的接入,产生了无穷无尽的变数.所以,接入SDK之前,如果你没有经验,或者没有被SDK坑过,那么当你看到这系列文章的时候,你很幸运,你可以避免这一切了.如果你之前被坑过,而且还在继续被坑着,那么现在,就是你解脱的时刻. 上一篇文章我们说了整个U8 SDK抽象

教你快速高效接入SDK——Unity统一接入渠道SDK(Unity篇)

上一篇,我们着重讲解了用Unity开发的手游,在接入U8SDK时,Android中的部分.接下来,这一篇,我们就来看看,在Unity工程中,我们需要怎么调用上一篇中我们提供的各种接口,以及怎么接收Android中的消息通知,比如登录成功,切换帐号成功等. 在写代码之前,我们先要做一个简单的配置,在Project面板中,按照Unity官方的要求,新建一个Plugins文件夹,在Plugins文件夹下,再建立一个Android文件夹.这里,将会放置所有Android工程相关的文件. 1.将上一篇中,

教你快速高效接入SDK——打包工具的实现(反编译资源动态整合打渠道包)

整套u8sdk的核心思想,就是让我们的SDK接入成本,能够控制在1,而不是N.啥意思呢?就是,我开发第一款游戏的时候,我接了这些SDK,当我开发第二款,第三款游戏的时候,这套SDK可以尽可能的复用,而不是每开发一款游戏,又从头去接各个渠道sdk.所有的游戏都能够使用同一套SDK接入框架,来快速完成SDK的接入工作.那么,在U8SDK里,我们怎么做到呢?请看我们总体的思路: 游戏A,游戏B,游戏C是三款不同的游戏,对于他们来说,他们只需要调用U8SDK抽象层提供的接口,就完成了所有SDK的接入工作

教你快速高效接入SDK——关于Application的适配和代理

我们知道,每个android应用程序中都有一个唯一的上下文Application对象,这个Application一般我们不需要去关心他,应用启动时,系统会自动创建一个默认的Application实例.但是,因为Application在整个应用中是唯一的,也就是说,他是一个单例.所以,有的应用就可能希望利用Application来完成一些工作. 好在,在android中,实现一个自定义的Application是很简单的.直接自定义一个类继承Application,然后在AndroidManifes