一款igg的手机端游,我想破解igg游戏官网,支付那方面肯定不可能了。但是通过修改物品使用不减少来修改

推 荐 游 戏
您当前的位置:········
频道头条 Big News
中医药科技成果推广
凤凰网财经
今日热图昨日热图
最热万象VIPIGG COO许元:所有游戏都会先去海外留学_网易科技
IGG COO许元:所有游戏都会先去海外留学
用微信扫码二维码
分享至好友和朋友圈
科技讯 7月31日消息,2014中国国际数码互动娱乐展览会(Chinajoy)第二天,IGG首席运营官许元在接受网易科技专访时表示,虽然IGG今年尝试回归国内市场,但是IGG的优势在海外,所以今后任何一款游戏都会让它到海外去先留学,深造好了再回来。许元认为,现在是手游的时代,周期短、速度快是这个时代的特点,IGG的打法就是一个一个市场的去推,好的产品就一定会取得好的成绩。而对于国内游戏市场的竞争现状,许元称,国内市场和国际市场的区别在与发行平台很分散,IGG也很看好类似于这样的手机厂商自己做的游戏发行平台。以下是网易科技专访IGG首席运营官许元的现场实录:网易科技:IGG在欧美市场有很大的知名度,但是对国内的玩家来讲还是比较陌生的,请您先介绍一下IGG。嘉宾:我们IGG是一个全球型的手机游戏公司,创立于2006年,从创立的第一天开始做的就是海外市场,截止到今年的五月份,差不多来自中国大陆的收益大概只有2%,剩下的98%都是海外收益,其中40%是来自美国,30%来自欧洲,还有另外25%来自东南亚,所以我们是一个针对海外的手机游戏公司,国内这些玩家朋友应该很少会听到我们,因为我们很少在中国大陆曝光。但实际上我们所有的研发团队,90%都是在中国大陆,我们正好是这么一支拿着中国大陆自己生产的游戏去征服全世界的这样一家公司。网易科技:目前IGG研发团队有多少人?嘉宾:我们目前有接近四百人。网易科技:IGG公司现在全部的研发力量都在手游产品上吗?嘉宾:对,是的,我们最早是做客户端游戏的,在2006年的时候我们做过客户端游戏,后来转型做了网页游戏,在2012年的时候再度做了一次转型,改行做了手机游戏。网易科技:据了解,近期IGG重新进入了国内市场,也在跟谈合作,IGG是怎么看待国内手游市场的?嘉宾:中国手游市场是一个非常蓬勃发展的市场,是一个非常庞大的市场,当然它也有它一定的闭塞性,所谓的闭塞也就是说在海外的研发人员很难打入到中国大陆,你看在中国大陆现在流行的这些手机游戏都是中国本地开发的,很少有像日本或者海外的游戏真正在中国取得巨大成功的,我们觉得我们的游戏在海外有很强大的竞争力,同时在中国的表现应该也还是不错的,自从我们的《城堡争霸》上了腾讯以后,在腾讯这边的收入应该也还是相当不错的。网易科技:IGG在海外运营上有丰富的经验,在您看来国内跟国外的市场有什么不同?嘉宾:国内市场会比较分散一些,如果你一个游戏要上线,你会发现有很多平台,像什么、91、小米、UCWEB或者是腾讯,海外市场的话非常简单,就是一个一个安卓的市场,你只要上了安卓市场以后,基本上你就已经是上了所有的平台,因为在海外真的是没有第三个平台可以让你去上。当然,最近好像出了亚马逊的平台,所以海外现在一共是三个平台可以上。网易科技:现在国内有很多优秀的游戏,但是在海外推广这块都遇到了很多问题,你认为拓展海外用户最大的困难是什么?嘉宾:我觉得应该是决心,一个公司能否在海外取得成功,这个困难,你做任何一个事情都会遇到困难,但是你真正能否成功是取决于你的老板是否有做海外市场的决心,有很多公司都在喊着说,我们要去做海外市场,但是真的很少有做成功的,为什么?大家碰到一点点困难就知难而退了。我们IGG在过去的六年里面没有任何退路,因为从第一天我们决定要做的市场就是海外市场,所以我们在这个市场上摸爬滚打,经历了各种各样的困难到今天,今天我们变成一家什么样的公司,我们变成一个可以用十五种不同的语言,在全球一百八十个国家直接运营游戏的公司。我们运营的速度有多快,我们的一款手游在去年8月1号上线的英文版,两周以后8月15号就上了中文繁体版,9月1号又过了两周上了德文版,从9月1号开始,每七天,9月8号上了法文版,又过了七天上了日文版,又过了七天上了土耳其文,再过七天上葡萄牙文,再过七天上意大利文,就这样一个一个,我们一共推出了十五个版本,连续的推出来,我所谓的推出来这个并不是讲只是把翻译好的游戏放出来而已,我们是在短短的一周之内要把游戏冲到那个国家或者是那个语言覆盖所有的国家,这个下载排行榜的第一名,而且要在一个月之内冲到它的收入排行榜的前十名,这是我们IGG的能力和我们IGG的速度,这些东西是在过去的七年里边我们一步一步积累出来的。网易科技:在网游时代的时候,有很多国外的大作拿到国内,或者国内的东西冲出去都会遇到水土不服的情况,这个问题在当时还是很大的,尤其是前几年,有不少很著名的欧美的网游拿到国内的话,玩家并不买单,这个情况您是怎么看的?嘉宾:从两个方面去看这个问题,一方面就是讲在过去,做客户端端游的时候,一个端游要做差不多四年的时间,非常的庞大,所以讲这个时候你说你要把它改成一个,比如你拿一个西方的产品要适应中国市场,你要做大量的修改,这个修改可能就是一年、两年的时间,所以讲绝大多数的厂商就不愿意去改,现在进入手游时代,我做一款手游的时间大概是六个月的时间,这六个月的时间我要再把它做一个本地化,改成另外一个国家的版本的话,大概一个月的时间就搞定了,所以这给了我们更多的发展空间,最早的时候我们游戏做出来,不一定能够适应海外的市场,我们不愿意去改,我们今天如果只是说你再多加一到两个月的时间,提供一个版本能够符合欧美玩家的审美观点,那他们就会接受。第二个就是说,现在的市场真的和以前不一样了,以前你要去推一款端游,你在海外非常困难,因为你要进入不同的国家,就要有不同的收费渠道,你要一家一家的去建立,你要去结识那些广告渠道,不同的国家有不同的广告渠道,不同的平台你要去上,非常的麻烦,非常的烦琐,但是今天手游时代的到来,这一切都变得非常简单了,你就在安卓上推出你的版本,然后指定你的广告渠道打磨一个国家,你就可以获得那个国家所有的用户。我们IGG正好是利用了这个时代,我管它叫推土机的时代,就是我们像刚刚讲的,我们在去年的8月1号开始推版本,一个一个又一个的上,当然我们也有遇到失败的市场,比方讲在日本市场,我们做的很好,但是我们确实失败了,我们当时是冲到了日本下载排行榜第一名,并且我们的收入也进入了日本收入排行榜的前十五名,但是这个游戏却下滑了,过了大概不到一个月的时间,它下滑到五十名开外,当时我会面临两个选择,选择一是说,那好,你们再调一些研发团队过来,让你的研发团队去把这个游戏修改成符合日本市场的用户习惯,以及符合他的文化背景的这么一个游戏,也许你能够在日本市场成功,但是还有另外一种方式,就是说算了,既然是推土机时代,我们就把它推过就算了,我们去推下一个市场,我们的选择就是第二种,我们不断地去一个一个市场开拓。我们看到的结果就是,虽然我们失去了日本这么一个庞大的市场,但是我们在很多其他的市场,包括德文、法文、意大利文、葡萄牙文还有俄罗斯市场都取得了成功,最让人兴奋的是我们在俄罗斯市场,去年10月份上线以后,从上线的一周以后我们就达到了俄罗斯的收入排行榜第一名,我们霸占了俄罗斯收入排行榜第一名的位置霸占了八个月的时间。网易科技:是哪一款游戏?嘉宾:就是我们的《城堡争霸》,这就是摆在我们面前的机遇,你只要去把握,真的是有很多的惊喜会让你感受得到,因为真的就是说,你像三年前我想都不敢想,我怎么会变成俄罗斯收入第一名,我觉得我能在俄罗斯赚到一点点钱就已经很开心,很不错了,但是今天我变成俄罗斯收入的第一名,而且长达八个月的时间,没有人能够撼动,我觉得我是非常自豪的一个事情,确实也是时势造英雄。网易科技:选择这个时候重回国内市场开拓,主要是因为什么?嘉宾:其实也是因为一个很简单的契机,就是我们在上市前我去拜访腾讯的朋友,其实他们是一个非常公平的一个公司,非常公正的一家公司,我可以讲非常职业化的一家公司,大家谈的过程中间,他说你们为什么能够上市,我说我们有一个很不错的游戏,叫做《城堡争霸》,当时在台湾收入第二名,在美国收入第四名,在香港、新加坡、马来西亚收入都是第一名,当时腾讯的朋友一看,哇,这么好的游戏,拿来我们看看,看了一下以后就觉得,你们这么好的游戏不做中国市场可惜了,独家代理给腾讯吧,我当时觉得非常好啊,二话没说就答应了。网易科技:IGG针对国内市场今后在产品上有什么规划?嘉宾:我觉得中国大陆市场是一个竞争非常激烈的市场,所以我们大概IGG每年会出十五到二十款产品,自己自主研发的,这些产品我们第一个市场可能不会是进入中国,我们会利用海外的市场去考验它,当我们在海外取得了比较显著的成绩以后,我们再把这个游戏拿回中国来,在中国市场上去竞争,否则的话一个游戏你如果在中国市场,因为中国市场其实是在全世界手游市场里面竞争应该是最激烈的,日本是最激烈的,韩国第二、中国第三。甚至于中国现在都可能排到第二、第一的这个程度。所以我们希望在这个产品还在孕育期,还在很幼小的时候,不要让它遭受太强大的刺激,先拿到国外去看看能不能赚钱,然后根据用户的习惯。因为现在今天我们都是手机用户,大家都是在两年前刚刚拿到手机然后自己开始玩起来,思想都被禁锢在苹果IOS和安卓这一套系统里面,所以大家玩手机的思维模式其实基本上都是一样的,日本用户很不一样,美国用户也好、欧洲用户也好,东南亚的用户也好,中国用户也好,其实真的都是非常相似的,所以当一个游戏你让美国用户喜欢了,中国用户其实也应该是都会喜欢的。网易科技:你怎么看待目前安卓系统手机厂商自己做游戏发行平台?嘉宾:我觉得他们应该也是非常有潜力的,你通过,包括像海外,像三星他们也是自己不但做手机,同时也做一个平台,有三星的App Store,当然最成功的还是苹果的App Store,苹果借用硬件跟软件的结合,变成现在世界上最成功的手机公司,所以像小米这些平台的话,我觉得未来应该还是很有,有很大的发展空间,只是讲在今天这个规模还算比较小,所以我觉得未来当他们发展到一定的规模,能够跟腾讯媲美的时候,我们肯定都会跟大家合作的。网易科技:还有一个关于现在游戏研发的问题,你觉得我们未来的市场,大概轻度游戏、中度游戏还有重度游戏占比大概会是什么样的。嘉宾:我们应该不太会做轻度游戏,我们应该都是在中度和重度之间,因为做游戏的话,游戏公司有它自己的DNA,有的游戏公司就特别会做轻度游戏,休闲游戏,像有的游戏公司就只会做重度游戏,当然我们比较幸运,正好处在中间,所以我们会做中度游戏,我们大多数的游戏还是在中间这个范畴。当然了,我们因为有很强大的中国背景,在中国大家也知道,在中国过去的十四年,都是这种游戏统治的天下,在中国这个市场上积累了大量的运营和研发的经验,以及所谓货币化的经验,这些东西是我们作为一家游戏公司可以借鉴的前人的经验,所以我们在这一块,相对于其他的欧美的公司来讲,我们是有很大的优势的,所以我们也会去做一些重度游戏。
网易科技:你觉得重度游戏会占市场的百分之多少,就是手游市场的,能占到多少?嘉宾:这个百分比就很难讲了,因为每次谈到整个大市场的百分比的时候,我一般都不会去对它进行一个预估,因为很难讲,因为我没有任何数据进行支撑。网易科技:我们在今年下半年在国内还有什么产品计划?嘉宾:在未来的一个月里面,我们应该就会连续推出大约是四到五款的新游戏。网易科技:感谢您能接受我们的采访!(摩沙雪)
本文来源:网易科技报道
责任编辑:王晓易_NE0011
用微信扫码二维码
分享至好友和朋友圈
加载更多新闻
热门产品:   
:        
:         
热门影院:
阅读下一篇
用微信扫描二维码
分享至好友和朋友圈玩转APP支付 - Python - 伯乐在线
& 玩转APP支付
近期公司的APP打算上线,需要集成支付的功能。由于采用的是Python进行开发,因此无法直接使用官方提供的SDK。虽然也有一些集成的第3方可以使用,比如、。
但是由于提供的时间比较充裕,于是就自己实现了1个。在这个过程中,难免遇到一些坑,而这些坑有时会困扰你很久。
最初,并没有打算写这么一篇文章,因为它的适用范围很窄。但是网上搜索到的关于APP支付方面的都是移动端iOS和Android的实现方式,对于服务端的实现寥寥无几。相比而言,python在当前毕竟是小众语言,而如果参考其他语言,比如php的实现,发现这个过程还是有不少地方是没有讲清楚的。
虽然对于很多开发者来说,支付这个功能涉及的知识点并不是很多,但是你会发现你却在这里耗费了很多的时间。有时1个签名的问题,就让你无法调用支付,比如支付宝的Alipay10问题,总是出现服务器繁忙的提示,其实就是你的签名出了问题。
在这里,由于涉及到公司的一些敏感信息的问题,因此下面代码中的签名用的都是测试数据,而签名是根据已经验证通过的函数调用计算出来的。当你发现自己签名不过时,可以直接复制这些字符串,然后比对下面计算出来的签名来查看你的签名函数及你的回调处理哪里出了问题。
首先为了避免耽误大家的时间,这里我们只实现了及支付宝的。对于微信公众支付及支付宝的其他支付场景是不适用的。
这里,限于篇幅,只对订单支付及异步回调的部分进行说明,因为如果把所有的接口都过一遍,太耗费时间,还不如直接在pypi上上传1个包,直接使用pip安装。
在这里,将用到的签名的方式单独提取出来进行讲解,对于相同产品其他的接口也是适用的,只是请求的参数有所变化而已。
个人建议及使用的库
在正式讲述APP支付之前,我有如下的建议:
Python版本&=2.7.9,由于Python版本2.7.9为1个bug修复版本,在这个版本中使用新的SSL模块,修复了之前HTTP客户端模块(比如urllib2,httplib)不对服务器证书进行校验的问题,详情请查看。
使用lxml,而不是标准库中的XML库,主要在于标准库中的XML模块无法检验恶意构造的数据,详情请查看。
使用pycrypto库用于支付宝RSA签名,版本&=2.61。这里使用的是pycrypto,是因为安装比较方便,另外因为版本2.61之前在某种情况下,使用fork会出现随机数不安全的问题,详情请查看。
下面我们需要理清我们要做的事情,避免不必要的工作。主要是如下2个方面:
服务端负责生成订单及签名,及接受支付异步通知
客户端负责使用服务端传来的订单信息调用支付接口,及根据SDK同步返回的支付结果展示结果页。
另外,私钥必须放在服务端,签名过程也必须放在服务端。
支付方式比较
在这2种支付方式中,我们需要对签名的信息(URL键值对,例如key1=value1&key2=valu2…)按照ASCII编码顺序进行排序后再进行签名,并且采用POST方式进行提交。
在微信中,签名的方式采用的是md5,而支付宝采用的RSA。
在微信支付中,提交和返回数据都为XML格式,其根节点为xml。而在支付宝中,采用的是使用表单提交的方式来进行。
由于微信支付采用的是XML格式,因此字符编码采用的是UTF-8,而支付宝需要指定参数_input_charset来指定编码,官方建议我们采用UTF-8。
下面我们正式进行APP支付流程的说明,在这个过程中,我们需要阅读官方提供的文档。这里我们从微信开始,因为相比支付宝,微信的支付调用更为简单些。
在进行模块代码编写之前,我们来看看官方提供的。换句话说,在我们调用接口后,我们需要给APP客户端返回prepayid及生成的签名,另外还有APP端接口中的其他字段。
这里,假设我们统一下单时请求参数如下:
appid=wx0ec43b&attach=支付测试&body=APP支付测试&mch_id=&nonce_str=1add1a30ac87aa2db72f57a2375d8fec&notify_url=http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php&out_trade_no=&spbill_create_ip=14.23.150.211&total_fee=1&trade_type=APP
appid=wx0ec43b&attach=支付测试&body=APP支付测试&mch_id=&nonce_str=1add1a30ac87aa2db72f57a2375d8fec&notify_url=http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php&out_trade_no=&spbill_create_ip=14.23.150.211&total_fee=1&trade_type=APP
而我们的商户号假设为,那么我们需要将商户号与之前的请求参数拼接在一起:
data = 'appid=wx0ec43b&attach=支付测试&body=APP支付测试&mch_id=&nonce_str=1add1a30ac87aa2db72f57a2375d8fec&notify_url=http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php&out_trade_no=&spbill_create_ip=14.23.150.211&total_fee=1&trade_type=APP&key='
&&& from hashlib import md5
&&& md5(data).hexdigest().upper()
'F3D12DF0DA652E97A766FA'
data = 'appid=wx0ec43b&attach=支付测试&body=APP支付测试&mch_id=&nonce_str=1add1a30ac87aa2db72f57a2375d8fec&notify_url=http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php&out_trade_no=&spbill_create_ip=14.23.150.211&total_fee=1&trade_type=APP&key='&&& from hashlib import md5&&& md5(data).hexdigest().upper()'F3D12DF0DA652E97A766FA'
这里我们拼接后的参数进行MD5加密后将其转换为大写字母,这样就得到我们需要的签名了。因此,在请求统一下单时,我们需要传递如下的字符串:
&appid&wx0ec43b&/appid&
&attach&支付测试&/attach&
&body&APP支付测试&/body&
&mch_id&&/mch_id&
&nonce_str&1add1a30ac87aa2db72f57a2375d8fec&/nonce_str&
&notify_url&http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php&/notify_url&
&out_trade_no&&/out_trade_no&
&spbill_create_ip&14.23.150.211&/spbill_create_ip&
&total_fee&1&/total_fee&
&trade_type&APP&/trade_type&
&sign&F3D12DF0DA652E97A766FA&/sign&
12345678910111213
&xml&&& &appid&wx0ec43b&/appid&&& &attach&支付测试&/attach&&& &body&APP支付测试&/body&&& &mch_id&&/mch_id&&& &nonce_str&1add1a30ac87aa2db72f57a2375d8fec&/nonce_str&&& &notify_url&http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php&/notify_url&&& &out_trade_no&&/out_trade_no&&& &spbill_create_ip&14.23.150.211&/spbill_create_ip&&& &total_fee&1&/total_fee&&& &trade_type&APP&/trade_type&&& &sign&F3D12DF0DA652E97A766FA&/sign&&/xml&
关于签名校验,微信官方提供了1个,当在请求返回的err_code出现SIGNERROR时可以使用这个工具来辅助我们进行校验。
返回给客户端APP
当我们成功请求统一下单接口后,返回的结果可能如下所示:
&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[OK]]&&/return_msg&
&appid&&![CDATA[wx0ec43b]]&&/appid&
&mch_id&&![CDATA[]]&&/mch_id&
&nonce_str&&![CDATA[IITRi8Iabbblz1Jc]]&&/nonce_str&
&sign&&![CDATA[EB8ED0CED72F]]&&/sign&
&result_code&&![CDATA[SUCCESS]]&&/result_code&
&prepay_id&&![CDATA[wx507cbf6ffd8b]]&&/prepay_id&
&trade_type&&![CDATA[APP]]&&/trade_type&
1234567891011
&xml&&& &return_code&&![CDATA[SUCCESS]]&&/return_code&&& &return_msg&&![CDATA[OK]]&&/return_msg&&& &appid&&![CDATA[wx0ec43b]]&&/appid&&& &mch_id&&![CDATA[]]&&/mch_id&&& &nonce_str&&![CDATA[IITRi8Iabbblz1Jc]]&&/nonce_str&&& &sign&&![CDATA[EB8ED0CED72F]]&&/sign&&& &result_code&&![CDATA[SUCCESS]]&&/result_code&&& &prepay_id&&![CDATA[wx507cbf6ffd8b]]&&/prepay_id&&& &trade_type&&![CDATA[APP]]&&/trade_type&&/xml&
接下来,我们需要取出返回结果中的prepay_id参数,然后按照接口中组装请求参数,假设我们得到如下的请求参数:
appid=wx0ec43b&noncestr=5K8264ILTKCH16CQ2&package=Sign=WXPay&partnerid=&prepayid=wx507cbf6ffd8b&timestamp=
appid=wx0ec43b&noncestr=5K8264ILTKCH16CQ2&package=Sign=WXPay&partnerid=&prepayid=wx507cbf6ffd8b&timestamp=
那么进行签名后将得到字符串A2AA6D297FBAC。那么我们返回给客户端APP的字段主要有prepayid、noncestr、timestamp、sign。
当用户成功完成支付后,微信会将相关支付信息推送到在统一下单时提交的notify_url指定的url地址中。在这一步,我们主要要做的是检验信息,比如签名是否正确、支付金额是否相同,可以在这个过程中修改订单的支付状态。
如果检验通过后,我们需要给微信返回类似如下的参数:
&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[OK]]&&/return_msg&
&xml&&&&return_code&&![CDATA[SUCCESS]]&&/return_code&&&&return_msg&&![CDATA[OK]]&&/return_msg&&/xml&
在这一步可能遇到的问题是无法接收到微信推送过来的参数,由于这里公司采用的是Flask,因此采用如下的方式来进行接收:
from flask import request
@app.route('/notify')
def notify():
req = request.stream.read()
from flask import request&...&@app.route('/notify')def notify():&& req = request.stream.read()&& ...
在这里,我采用的是从原始流中进行直接读取操作。
说完了微信,我们来看下支付宝的情况。
这里我采用UTF-8编码进行处理,并查看如下的,让我们对支付流程有1个了解。
在正式开始支付宝的支付之前,我们先来说下基础的一些内容,首先是要使用的私钥要是PKCS8格式的。然后是需要传递给支付宝的参数,其中基本参数partner、_input_charset、sign、sign_type、service这些属于基本参数,是必须要传递的参数。关于需要传递参数的内容请查阅。
支付待签名字符串生成
关于支付请求参数,我们可以查看下面的链接。
在支付宝APP支付中,我们需要请求参数中需要剔除sign_type、sign这2个参数,并在签名之前需要对字符串进行UTF-8的urlencode,即待签名字符串如果有中文则必须未转义形式显示,例如:
_input_charset="utf-8"&notify_url="http://notify.msp.hk/notify.htm"&out_trade_no="-6177"&partner="8364"&seller_id=""&service="mobile.securitypay.pay"&subject="测试"&payment_type="1"&total_fee="0.01"
_input_charset="utf-8"&notify_url="http://notify.msp.hk/notify.htm"&out_trade_no="-6177"&partner="8364"&seller_id=""&service="mobile.securitypay.pay"&subject="测试"&payment_type="1"&total_fee="0.01"
在这里,我们对请求的参数进行了排序,然后请求的参数的数值需要添加双引号。之后,我们需要对上面的字符串进行签名处理,这里我们假设我们的私钥如下:
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDQ3/XlPY/IFw8FISXKHVRLICPSEPmWCauMtKPoAc9M6szlCjG+
YqtxaigPwVdRqoG3m24uMgz36qXyANvXMB3X7e6t6g1DoI3wxy5aNNlE0Dlu0BIH
rcLUFsSZgCTuAvOori2oGVp6StXz0Wg5kacICnf6GNHCM1B2IgshEQte2wIDAQAB
AoGAMkbmanKiDFi4jdSHwxnCM38eAC+D1ECpoWnN1kexPWN7RFpq1NftSpRx5jD0
srynEqoAIHB9vKMnpJPeVvLHC8ZvtZyehQPTvdaqdeORcZUhaYHYBWgiCCr/6fgW
00yxR+UrYZFY6DEHbHkXgXqtEFzoVYIVwI6a90F/xFQ8hpECQQDoypOny/zUvocc
hTQ/JuqsmZXKNZgU+1c/3Kflz7RDpi9e94yR9eaBSLBTDEkngJkJD5/riTzC0O4A
Hb/2+5vzAkEA5bL5lgoCWyyVlvy/PBbZ2Ilcf+vMyvtyDBWklW9xrXEy53W+G4Qq
NSatTzNHN2VNEqFz2/3xNIbFlMpHzU3zeQJBAJS3thTgkKko/xANWQ9vQUT66WLB
UmM1HsxBn1GFm9gL9v9ojnlA6v10/pBPrPx7f0j2nmfOyO58o0+XseeLXlkCQB55
k2GTrGJaVPJ2UAzx3y86cjpKl54qpCP0TyTAZ22igiVxWqqd61en7QCABifUWdhp
8UwzsefNJbOq7sHPYMkCQACbuh1TKx9AlZz1kPoAagBsZofx4cb5QnHpmIzREbRd
aydfoaqR5BKpjJXky4tyBDeyp50s96UUd/eEYDC8RV4=
-----END RSA PRIVATE KEY-----
123456789101112131415
-----BEGIN RSA PRIVATE KEY-----MIICXAIBAAKBgQDQ3/XlPY/IFw8FISXKHVRLICPSEPmWCauMtKPoAc9M6szlCjG+YqtxaigPwVdRqoG3m24uMgz36qXyANvXMB3X7e6t6g1DoI3wxy5aNNlE0Dlu0BIHrcLUFsSZgCTuAvOori2oGVp6StXz0Wg5kacICnf6GNHCM1B2IgshEQte2wIDAQABAoGAMkbmanKiDFi4jdSHwxnCM38eAC+D1ECpoWnN1kexPWN7RFpq1NftSpRx5jD0srynEqoAIHB9vKMnpJPeVvLHC8ZvtZyehQPTvdaqdeORcZUhaYHYBWgiCCr/6fgW00yxR+UrYZFY6DEHbHkXgXqtEFzoVYIVwI6a90F/xFQ8hpECQQDoypOny/zUvocchTQ/JuqsmZXKNZgU+1c/3Kflz7RDpi9e94yR9eaBSLBTDEkngJkJD5/riTzC0O4AHb/2+5vzAkEA5bL5lgoCWyyVlvy/PBbZ2Ilcf+vMyvtyDBWklW9xrXEy53W+G4QqNSatTzNHN2VNEqFz2/3xNIbFlMpHzU3zeQJBAJS3thTgkKko/xANWQ9vQUT66WLBUmM1HsxBn1GFm9gL9v9ojnlA6v10/pBPrPx7f0j2nmfOyO58o0+XseeLXlkCQB55k2GTrGJaVPJ2UAzx3y86cjpKl54qpCP0TyTAZ22igiVxWqqd61en7QCABifUWdhp8UwzsefNJbOq7sHPYMkCQACbuh1TKx9AlZz1kPoAagBsZofx4cb5QnHpmIzREbRdaydfoaqR5BKpjJXky4tyBDeyp50s96UUd/eEYDC8RV4=-----END RSA PRIVATE KEY-----
在RSA签名就验证签名中,我们需要确保公钥和私钥都包含在BEGIN和END之间,且不需要进行将其放在1行中。
然后我们使用如下的方式进行签名操作:
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto.PublicKey import RSA
from base64 import b64encode
message = '_input_charset="utf-8"&notify_url="http://notify.msp.hk/notify.htm"&out_trade_no="-6177"&partner="8364"&seller_id=""&service="mobile.securitypay.pay"&subject="测试"&payment_type="1"&total_fee="0.01"'
key = RSA.importKey(open('rsa_private_key.pem').read())
h = SHA.new()
h.update(message)
signer = PKCS1_v1_5.new(key)
signature = signer.sign(h)
print b64encode(signature)
12345678910111213
from Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHAfrom Crypto.PublicKey import RSA&from base64 import b64encode&message = '_input_charset="utf-8"&notify_url="http://notify.msp.hk/notify.htm"&out_trade_no="-6177"&partner="8364"&seller_id=""&service="mobile.securitypay.pay"&subject="测试"&payment_type="1"&total_fee="0.01"'key = RSA.importKey(open('rsa_private_key.pem').read())h = SHA.new()h.update(message)signer = PKCS1_v1_5.new(key)signature = signer.sign(h)print b64encode(signature)
这样我们将得到签名:
FDW1YrI/FeX841orIDZ+rYyacSyDtWs4d+GPNpEMbWd38TpmePLagEIzAd8DDB3TlLxwyiA/IgGYIiLPQOk8qdIdp3AkjWHEMPmRbULZx2bMVNJlJy/yunOAbJRIJhP3I1Ip/nCFRVvBmBE3I8Mt95UQtYhtLkx+fZbuXmpCckQ=
FDW1YrI/FeX841orIDZ+rYyacSyDtWs4d+GPNpEMbWd38TpmePLagEIzAd8DDB3TlLxwyiA/IgGYIiLPQOk8qdIdp3AkjWHEMPmRbULZx2bMVNJlJy/yunOAbJRIJhP3I1Ip/nCFRVvBmBE3I8Mt95UQtYhtLkx+fZbuXmpCckQ=
在这里,官方所说的是SHAWithRSA函数对应于PKCS1_V1_5标准外加SHA1加密方式,需要主要的是这里生成的私钥的长度是1024位。
然后我们对参数字符串进行拼接将得到:
_input_charset="utf-8"&notify_url="http://notify.msp.hk/notify.htm"&out_trade_no="-6177"&partner="8364"&seller_id=""&service="mobile.securitypay.pay"&subject="测试"&payment_type="1"&total_fee="0.01"&sign="FDW1YrI/FeX841orIDZ+rYyacSyDtWs4d+GPNpEMbWd38TpmePLagEIzAd8DDB3TlLxwyiA/IgGYIiLPQOk8qdIdp3AkjWHEMPmRbULZx2bMVNJlJy/yunOAbJRIJhP3I1Ip/nCFRVvBmBE3I8Mt95UQtYhtLkx+fZbuXmpCckQ="&sign_type="RSA"
_input_charset="utf-8"&notify_url="http://notify.msp.hk/notify.htm"&out_trade_no="-6177"&partner="8364"&seller_id=""&service="mobile.securitypay.pay"&subject="测试"&payment_type="1"&total_fee="0.01"&sign="FDW1YrI/FeX841orIDZ+rYyacSyDtWs4d+GPNpEMbWd38TpmePLagEIzAd8DDB3TlLxwyiA/IgGYIiLPQOk8qdIdp3AkjWHEMPmRbULZx2bMVNJlJy/yunOAbJRIJhP3I1Ip/nCFRVvBmBE3I8Mt95UQtYhtLkx+fZbuXmpCckQ="&sign_type="RSA"
我们将生成的这串字符串返回给客户端APP调用即可。
与微信一样,当用户成功支付后,支付宝会主动以POST方式将数据推送给你提交的notify_url中的URL。在这里,我们需要以表单的形式来接收传递过来的参数。
在此之前,我们说下一些关于通知的内容:
通知触发条件:支付宝只有在交易成功、支付成功以及交易创建是会触发通知,对于交易关闭时不触发通知的,换句话说在这些情况下会主动推送消息给你。
通知交易状态:主要有4种状态,TRADE_SUCCESS,TRADE_FINISHED、TRADE_CLOSED,WAIT_BUYER_PAY,分别对应交易成功、交易完成、交易关闭和等待买家付款。
而支付宝会传递过来的参数,我们可以查看。
在异步回调中,我们需要完成如下2个验证的工作:
验证是否是支付宝发来的通知
对于第2个验证,我们需要拼装成如下的URL:
https://mapi.alipay.com/gateway.do?service=notify_verify&partner=2354&notify_id=RqPnCoPT3K9%252Fvwbh3I%252BFioE227%252BPfNMl8jwyZqMIiXQWxhOCmQ5MQO%252FWd93rvCB%252BaiGg
https://mapi.alipay.com/gateway.do?service=notify_verify&partner=2354&notify_id=RqPnCoPT3K9%252Fvwbh3I%252BFioE227%252BPfNMl8jwyZqMIiXQWxhOCmQ5MQO%252FWd93rvCB%252BaiGg
然后我们进行GET请求,而结果会返回1个true或false的字符串。
对于第1种验证,假设我们有如下的字符串:
discount=0.00&payment_type=8&subject=测试&trade_no=4842&buyer_email=&gmt_create= 14:45:23&notify_type=trade_status_sync&quantity=1&out_trade_no=710&seller_id=6263&notify_time= 14:45:24&body=测试测试&trade_status=TRADE_SUCCESS&is_total_fee_adjust=N&total_fee=1.00&gmt_payment= 14:45:24&seller_email=&price=1.00&buyer_id=5429&notify_id=64ce1b6ab92d00ede0ee56ade98fdf2f4c&use_coupon=N&sign_type=RSA&sign=1glihU9DPWee+UJ82u3+mw3Bdnr9u01at0M/xJnPsGuHh+JA5bk3zbWaoWhU6GmLab3dIM4JNdktTcEUI9/FBGhgfLO39BKX/eBCFQ3bXAmIZn4l26fiwoO613BptT44GTEtnPiQ6+tnLsGlVSrFZaLB9FVhrGfipH2SWJcnwYs=
discount=0.00&payment_type=8&subject=测试&trade_no=4842&buyer_email=dlwdgl@gmail.com&gmt_create=2013-08-22 14:45:23&notify_type=trade_status_sync&quantity=1&out_trade_no=710&seller_id=6263&notify_time=2013-08-22 14:45:24&body=测试测试&trade_status=TRADE_SUCCESS&is_total_fee_adjust=N&total_fee=1.00&gmt_payment=2013-08-22 14:45:24&seller_email=xxx@alipay.com&price=1.00&buyer_id=5429&notify_id=64ce1b6ab92d00ede0ee56ade98fdf2f4c&use_coupon=N&sign_type=RSA&sign=1glihU9DPWee+UJ82u3+mw3Bdnr9u01at0M/xJnPsGuHh+JA5bk3zbWaoWhU6GmLab3dIM4JNdktTcEUI9/FBGhgfLO39BKX/eBCFQ3bXAmIZn4l26fiwoO613BptT44GTEtnPiQ6+tnLsGlVSrFZaLB9FVhrGfipH2SWJcnwYs=
我们剔除了sign和sign_type参数后,按照ASCII顺序进行排序,我们将得到如下的字符串:
body=测试测试&buyer_email=&buyer_id=5429&discount=0.00&gmt_create= 14:45:23&gmt_payment= 14:45:24&is_total_fee_adjust=N&notify_time= 14:45:24&notify_type=trade_status_sync&out_trade_no=710&payment_type=8&price=1.00&quantity=1&seller_email=&seller_id=6263&subject=测试&total_fee=1.00&trade_no=4842&trade_status=TRADE_SUCCESS&use_coupon=N
body=测试测试&buyer_email=dlwdgl@gmail.com&buyer_id=5429&discount=0.00&gmt_create=2013-08-22 14:45:23&gmt_payment=2013-08-22 14:45:24&is_total_fee_adjust=N&notify_time=2013-08-22 14:45:24&notify_type=trade_status_sync&out_trade_no=710&payment_type=8&price=1.00&quantity=1&seller_email=alipayrisk18@alipay.com&seller_id=6263&subject=测试&total_fee=1.00&trade_no=4842&trade_status=TRADE_SUCCESS&use_coupon=N
然后我们进行如下的验证签名:
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA
from Crypto.PublicKey import RSA
from base64 import b64decode
sign = '1glihU9DPWee+UJ82u3+mw3Bdnr9u01at0M/xJnPsGuHh+JA5bk3zbWaoWhU6GmLab3dIM4JNdktTcEUI9/FBGhgfLO39BKX/eBCFQ3bXAmIZn4l26fiwoO613BptT44GTEtnPiQ6+tnLsGlVSrFZaLB9FVhrGfipH2SWJcnwYs='
msg = 'body=测试测试&buyer_email=&buyer_id=5429&discount=0.00&gmt_create= 14:45:23&gmt_payment= 14:45:24&is_total_fee_adjust=N&notify_time= 14:45:24&notify_type=trade_status_sync&out_trade_no=710&payment_type=8&price=1.00&quantity=1&seller_email=&seller_id=6263&subject测试&total_fee=1.00&trade_no=4842&trade_status=TRADE_SUCCESS&use_coupon=N'
key = RSA.importKey(open('alipay_public_key.pem').read())
sign = b64decode(sign)
h = SHA.new(msg)
verifier = PKCS1_v1_5.new(key)
print verifier.verify(h,sign)
123456789101112131415
from Crypto.Signature import PKCS1_v1_5from Crypto.Hash import SHAfrom Crypto.PublicKey import RSA&from base64 import b64decode&sign = '1glihU9DPWee+UJ82u3+mw3Bdnr9u01at0M/xJnPsGuHh+JA5bk3zbWaoWhU6GmLab3dIM4JNdktTcEUI9/FBGhgfLO39BKX/eBCFQ3bXAmIZn4l26fiwoO613BptT44GTEtnPiQ6+tnLsGlVSrFZaLB9FVhrGfipH2SWJcnwYs='&msg = 'body=测试测试&buyer_email=&buyer_id=5429&discount=0.00&gmt_create= 14:45:23&gmt_payment= 14:45:24&is_total_fee_adjust=N&notify_time= 14:45:24&notify_type=trade_status_sync&out_trade_no=710&payment_type=8&price=1.00&quantity=1&seller_email=&seller_id=6263&subject测试&total_fee=1.00&trade_no=4842&trade_status=TRADE_SUCCESS&use_coupon=N'&key = RSA.importKey(open('alipay_public_key.pem').read())sign = b64decode(sign)h = SHA.new(msg)verifier = PKCS1_v1_5.new(key)print verifier.verify(h,sign)
在这里,我们读取支付宝的公钥,然后对签名进行base64编码解密,然后进行比对操作,其结果为1个布尔值。
最后,如果2个检验都通过,我们需要返回给支付宝1个字符串success即可。
可能感兴趣的话题
关于 Python 频道
Python频道分享 Python 开发技术、相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2018 伯乐在线

我要回帖

更多关于 igg修改器破解版 的文章

 

随机推荐