这里有新鲜出炉的 PHP 教程,程序狗速度看过来!
PHP(外文名: Hypertext Preprocessor,中文名:"超文本预处理器")是一种通用开源脚本语言。语法吸收了 C 语言、Java 和 Perl 的特点,入门门槛较低,易于学习,使用广泛,主要适用于 web 开发领域。PHP 的文件后缀名为 php。
这篇文章主要介绍了 PHP 实现 RSA 签名生成订单功能, 涉及 php 随机字符串及编码相关操作技巧, 以及支付宝公钥文件读取与使用方法, 需要的朋友可以参考下
本文实例讲述了 PHP 实现 RSA 签名生成订单功能。分享给大家供大家参考,具体如下:
- //组合签名
- $a = time();
- $b = substr($a, 1);
- //生成随机订单号
- $orderid = $b.mt_rand(10000, 99999);
- //合作身份者id,以2088开头的16位纯数字
- $mygoods['partner'] = "2088011744308664";
- //商家账号
- $mygoods['seller'] = "2088011744308664";
- //订单号
- $mygoods['out_trade_no'] = $orderid;
- //主题
- $mygoods['subject'] = $goods_name;
- //商品描述信息
- $mygoods['body'] = $goods_infro;
- //商品价格
- $mygoods['total_fee'] = $score;
- //服务器端异步响应地址
- $mygoods['notify_url'] = "http://211.149.220.47/php/notify_url.php";
- //排序
- $mygoods = argSort($mygoods);
- //拼接
- $mystr = createLinkstring($mygoods);
- //签名
- $sign = rsaSign($mystr);
- //对签名进行urlencode转码
- $sign = urlencode($sign);
- //生成最终签名信息
- $orderInfor = $mystr."&sign=".$sign."&sign_type=RSA";
- /*******特殊的 验签支付宝反馈给App的签名信息*******/
- //支付宝反馈给App端信息拆解如下
- $str = 'body=精品儿童书包喜洋洋的¬ify_url=http://211.149.220.47/php/notify_url.php&out_trade_no=40609294027478&partner=2088011744308664&seller=2088011744308664&subject=书包&success=true&total_fee=0.01';
- //被拆解后的支付宝签名
- $sign = 'Itorzqous2F7kYWWOpmoB/JUYgySRzh/OOKMhVhv+M48CnFk+QCp2cKCSSNGcDTs2AsAk+RYTuyMYZkGH56t8jcV2GGFkrJr/PxcGRlEK08QadAhImYzy9piVjoW0102lhSJYapiXGBTl5eiZ88RiyRA62D2nJEtH/BVXpuq63A=';
- //得到签名
- $sign = urldecode($sign);
- //得到待签名字符串
- $str = urldecode($str);
- //验签数据,验签成功将返回true 否则 flase
- var_dump(verify($str, $sign));
- /*************************需要使用到的方法*******************************/
- /**
- * 把数组所有元素,按照"参数=参数值"的模式用"&"字符拼接成字符串
- * @param $para 需要拼接的数组
- * return 拼接完成以后的字符串
- */
- function createLinkstring($para) {
- $arg = "";
- while (list($key, $val) = each($para)) {
- $arg. = $key."=".$val."&";
- }
- //去掉最后一个&字符
- $arg = substr($arg, 0, count($arg) - 2);
- //如果存在转义字符,那么去掉转义
- if (get_magic_quotes_gpc()) {
- $arg = stripslashes($arg);
- }
- return $arg;
- }
- /**
- * 对数组排序
- * @param $para 排序前的数组
- * return 排序后的数组
- */
- function argSort($para) {
- ksort($para);
- reset($para);
- return $para;
- }
- /**
- * RSA签名
- * @param $data 待签名数据
- * @param $private_key_path 商户私钥文件路径
- * return 签名结果
- */
- function rsaSign($data, $private_key_path) {
- $priKey = file_get_contents($private_key_path);
- $res = openssl_get_privatekey($priKey);
- openssl_sign($data, $sign, $res);
- openssl_free_key($res);
- //base64编码
- $sign = base64_encode($sign);
- return $sign;
- }
- /**RSA验签
- * $data待签名数据
- * $sign需要验签的签名
- * 验签用支付宝公钥
- * return 验签是否通过 bool值
- */
- function verify($data, $sign) {
- //读取支付宝公钥文件
- $pubKey = file_get_contents('key/alipay_public_key.pem');
- //转换为openssl格式密钥
- $res = openssl_get_publickey($pubKey);
- //调用openssl内置方法验签,返回bool值
- $result = (bool) openssl_verify($data, base64_decode($sign), $res);
- //释放资源
- openssl_free_key($res);
- //返回资源是否成功
- return $result;
- }
希望本文所述对大家 PHP 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0808/339628.html