仓酷云

标题: PHP教程之PHP付出宝接口RSA考证 [打印本页]

作者: 仓酷云    时间: 2015-1-16 22:13
标题: PHP教程之PHP付出宝接口RSA考证
用C语言重新编写,包括可以访问数据库。他将这些程序和一些表单直译器整合起来,称为PHP/FI。PHP/FI可以和数据库连接,产生简单的动态网页程序。这两天一向困扰的PHPRSA署名考证成绩终究办理了,因为之前RSA打仗的未几,再加上官方至今还未有PHP的SDK可供参考,因而走了一些弯路,写在这里和人人分享。固然付出宝官方还未供应相干SDK,PHP的确能够完成RSA体例的署名,这点实在很主要,因为不熟习,在碰到坚苦的时分,常常会情不自禁地想到是不是PHP不撑持RSA署名,爽性用MD5得了,如许就没有了行进的动力。实在说穿了MD5和RSA署名,分歧的只是署名体例的区分,其他的都一样,因而我这里次要说一下怎样用RSA举行署名和验签。起首你必要筹办上面的器材:php的openssl扩大里已封装好了验签的办法openssl_verify。假如在Windows下的php.ini必要开启Openssl模块:extension=php_openssl.dll商户私钥:即RSA私钥,依照手册,按以下体例天生:opensslgenrsa-outrsa_private_key.pem1024商户公钥:即RSA私钥,依照手册,按以下体例天生:opensslrsa-inrsa_private_key.pem-pubout-outrsa_public_key.pem天生以后,依照手册的申明,必要在签约平台上传公钥,必要注重的是,上传的时分必要把一切的正文和换行都往失落。别的手册中另有以下命令:opensslpkcs8-topk8-informPEM-inrsa_private_key.pem-outformPEM-nocrypt该命令将RSA私钥转换成PKCS8格局,关于PHP来讲,不必要。付出宝公钥:依据手册,在签约平台取得。假如你间接复制上去的话,会失掉一个字符串,必要举行上面的转换;1)把空格酿成换行2)增加正文好比你复制上去的公钥是:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYtztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4MUmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9jTCoccYMDXEIWYTs3CwIDAQAB,那转换以后为:-----BEGINPUBLICKEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYtztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4MUmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9jTCoccYMDXEIWYTs3CwIDAQAB-----ENDPUBLICKEY-----把公钥保留在文件里。注重这个是2048位的公钥应当是9行大概10行,不克不及为1行,否则PHP的openssl_pkey_get_public没法读取,pub_key_id的了局为false,假如没有-----BEGINPUBLICKEY-----和-----ENDPUBLICKEY-----能够本人加上,最初保留到一个rsa_public_key.pem文件中。好了,如今已有了一切的器材,先看署名函数:复制代码1<?php2/**3*署名字符串4*@param$prestr必要署名的字符串5*return署名了局6*/7functionrsaSign($prestr){8$public_key=file_get_contents(rsa_private_key.pem);9$pkeyid=openssl_get_privatekey($public_key);10openssl_sign($prestr,$sign,$pkeyid);11openssl_free_key($pkeyid);12$sign=base64_encode($sign);13return$sign;14}15?>复制代码注重点:1.$prestr的内容和MD5一样(拜见手册,但不包括最初的MD5暗码)2.署名用商户私钥3.最初的署名,必要用base64编码4.这个函数前往的值,就是此次哀求的RSA署名。验签函数:复制代码1<?php2/**3*考证署名4*@param$prestr必要署名的字符串5*@param$sign署名了局6*return署名了局7*/8functionrsaVerify($prestr,$sign){9$sign=base64_decode($sign);10$public_key=file_get_contents(rsa_public_key.pem);11$pkeyid=openssl_get_publickey($public_key);12if($pkeyid){13$verify=openssl_verify($prestr,$sign,$pkeyid);14openssl_free_key($pkeyid);15}16if($verify==1){17returntrue;18}else{19returnfalse;20}21}22?>复制代码注重点:1.$prestr的内容和MD5一样(拜见手册)2.$sign是付出宝接口前往的sign参数用base64_decode解码以后的二进制3.验签用付出宝公钥4.这个函数前往一个布尔值,间接告知你,验签是不是经由过程付出宝官方供应的PHP版SDKdemo中只对MD5加密体例举行了处置,但android端和ios端哀求付出宝加密体例只能用RSA加密算法,这时候服务端PHP就没法考证署名了,以是必要对demo举行一些修正。1、修正alipay_notify.class.php文件verifyNotify函数第46行$isSign=$this->getSignVeryfy($_POST,$_POST["sign"]);改成$isSign=$this->getSignVeryfy($_POST,$_POST["sign"],$_POST["sign_type"]);verifyReturn函数第83行$isSign=$this->getSignVeryfy($_GET,$_GET["sign"]);改成$isSign=$this->getSignVeryfy($_GET,$_GET["sign"],$_GET["sign_type"]);getSignVeryfy函数116行functiongetSignVeryfy($para_temp,$sign){改成functiongetSignVeryfy($para_temp,$sign,$sign_type){getSignVeryfy函数127行switch(strtoupper(trim($this->alipay_config[sign_type]))){case"MD5":$isSgin=md5Verify($prestr,$sign,$this->alipay_config[key]);break;default:$isSgin=false;}改成switch(strtoupper(trim($sign_type))){case"MD5":$isSgin=md5Verify($prestr,$sign,$this->alipay_config[key]);break;case"RSA":$isSgin=rsaVerify($prestr,$sign);break;default:$isSgin=false;}2、新建一个alipay_rsa.function.php文件复制代码1<?php2/**3*RSA4*具体:RSA加密5*版本:3.36*日期:2014-02-207*申明:8*以下代码只是为了便利商户测试而供应的样例代码,商户能够依据本人网站的必要,依照手艺文档编写,并不是必定要利用该代码。9*该代码仅供进修和研讨付出宝接口利用,只是供应一个参考。10*/11/**12*署名字符串13*@param$prestr必要署名的字符串14*return署名了局15*/16functionrsaSign($prestr){17$public_key=file_get_contents(rsa_private_key.pem);18$pkeyid=openssl_get_privatekey($public_key);19openssl_sign($prestr,$sign,$pkeyid);20openssl_free_key($pkeyid);21$sign=base64_encode($sign);22return$sign;23}24/**25*考证署名26*@param$prestr必要署名的字符串27*@param$sign署名了局28*return署名了局29*/30functionrsaVerify($prestr,$sign){31$sign=base64_decode($sign);32$public_key=file_get_contents(rsa_public_key.pem);33$pkeyid=openssl_get_publickey($public_key);34if($pkeyid){35$verify=openssl_verify($prestr,$sign,$pkeyid);36openssl_free_key($pkeyid);37}38if($verify==1){39returntrue;40}else{41returnfalse;42}43}44?>复制代码最初要说的是官方供应的手册上说的基础上都是准确的,只是有些中央没有说的很具体,开辟的时分必定要多参考,大抵就是如许,祝人人好运。如果不会怎么办,我的视频教程里有个最简单的留言板最开始离不开模仿,
作者: 因胸联盟    时间: 2015-1-19 05:06
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 深爱那片海    时间: 2015-1-25 14:31
在学习的过程中不能怕麻烦,不能有懒惰的思想。学习php首先应该搭建一个lamp环境或者是wamp环境。这是学习php开发的根本。虽然网络上有很多集成的环境,安装很方便,使用起来也很稳定、
作者: 爱飞    时间: 2015-2-2 22:27
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: 分手快乐    时间: 2015-2-8 15:46
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 蒙在股里    时间: 2015-2-25 20:05
装在C盘下面可以利用windows的ghost功能可以还原回来(顺便当做是重转啦),当然啦我的编译目录要放在别的盘下,不然自己的劳动成果就悲剧啦。
作者: 简单生活    时间: 2015-3-8 04:21
找到的的资料很多都是在论坛里的,需要注册,所以我一般没到一个论坛都注册一个id,所有的id都注册成一样的,这样下次再进来的时候就不用重复注册啦。当然有些论坛的某些资料是需要的付费的。
作者: 小女巫    时间: 2015-3-22 05:10
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2