Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53230
  • 博文数量: 48
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-12 11:48
文章分类
文章存档

2016年(48)

我的朋友

分类: PHP

2016-12-05 17:28:51

       wemall-mobile是基于WeMall的 app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。本文分享wemall app商城源码Android之处理支付宝各接口通知返回,供技术员参考学习。

      以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码,该代码仅供学习和研究支付宝接口使用,只是提供一个参考,调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常。

wemall官网地址:

点击(此处)折叠或打开

  1. <?php
  2. require_once("alipay_core.function.php");
  3. require_once("alipay_rsa.function.php");
  4. require_once("alipay_md5.function.php");

  5. class AlipayNotify {
  6.     /**
  7.      * HTTPS形式消息验证地址
  8.      */
  9.     var $https_verify_url = '';
  10.     /**
  11.      * HTTP形式消息验证地址
  12.      */
  13.     var $http_verify_url = '';
  14.     var $alipay_config;

  15.     function __construct($alipay_config){
  16.         $this->alipay_config = $alipay_config;
  17.     }
  18.     function AlipayNotify($alipay_config) {
  19.         $this->__construct($alipay_config);
  20.     }
  21.     /**
  22.      * 针对notify_url验证消息是否是支付宝发出的合法消息
  23.      * @return 验证结果
  24.      */
  25.     function verifyNotify(){
  26.         if(empty($_POST)) {//判断POST来的数组是否为空
  27.             return false;
  28.         }
  29.         else {
  30.             
  31.             //对notify_data解密
  32.             $decrypt_post_para = $_POST;
  33.             if ($this->alipay_config['sign_type'] == '0001') {
  34.                 $decrypt_post_para['notify_data'] = rsaDecrypt($decrypt_post_para['notify_data'], $this->alipay_config['private_key_path']);
  35.             }
  36.             
  37.             //notify_id从decrypt_post_para中解析出来(也就是说decrypt_post_para中已经包含notify_id的内容)
  38.             $doc = new DOMDocument();
  39.             $doc->loadXML($decrypt_post_para['notify_data']);
  40.             $notify_id = $doc->getElementsByTagName( "notify_id" )->item(0)->nodeValue;
  41.             
  42.             //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
  43.             $responseTxt = 'true';
  44.             if (! empty($notify_id)) {$responseTxt = $this->getResponse($notify_id);}
  45.             
  46.             //生成签名结果
  47.             $isSign = $this->getSignVeryfy($decrypt_post_para, $_POST["sign"],false);
  48.             
  49.             //写日志记录
  50.             //if ($isSign) {
  51.             //    $isSignStr = 'true';
  52.             //}
  53.             //else {
  54.             //    $isSignStr = 'false';
  55.             //}
  56.             //$log_text = "responseTxt=".$responseTxt."\n notify_url_log:isSign=".$isSignStr.",";
  57.             //$log_text = $log_text.createLinkString($_POST);
  58.             //logResult($log_text);
  59.             
  60.             //验证
  61.             //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
  62.             //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
  63.             if (preg_match("/true$/i",$responseTxt) && $isSign) {
  64.                 return true;
  65.             } else {
  66.                 return false;
  67.             }
  68.         }
  69.     }
  70.     
  71.     /**
  72.      * 针对return_url验证消息是否是支付宝发出的合法消息
  73.      * @return 验证结果
  74.      */
  75.     function verifyReturn(){
  76.         if(empty($_GET)) {//判断GET来的数组是否为空
  77.             return false;
  78.         }
  79.         else {
  80.             //生成签名结果
  81.             $isSign = $this->getSignVeryfy($_GET, $_GET["sign"],true);
  82.             
  83.             //写日志记录
  84.             //if ($isSign) {
  85.             //    $isSignStr = 'true';
  86.             //}
  87.             //else {
  88.             //    $isSignStr = 'false';
  89.             //}
  90.             //$log_text = "return_url_log:isSign=".$isSignStr.",";
  91.             //$log_text = $log_text.createLinkString($_GET);
  92.             //logResult($log_text);
  93.             
  94.             //验证
  95.             //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
  96.             //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
  97.             if ($isSign) {
  98.                 return true;
  99.             } else {
  100.                 return false;
  101.             }
  102.         }
  103.     }
  104.     
  105.     /**
  106.      * 解密
  107.      * @param $input_para 要解密数据
  108.      * @return 解密后结果
  109.      */
  110.     function decrypt($prestr) {
  111.         return rsaDecrypt($prestr, trim($this->alipay_config['private_key_path']));
  112.     }
  113.     
  114.     /**
  115.      * 异步通知时,对参数做固定排序
  116.      * @param $para 排序前的参数组
  117.      * @return 排序后的参数组
  118.      */
  119.     function sortNotifyPara($para) {
  120.         $para_sort['service'] = $para['service'];
  121.         $para_sort['v'] = $para['v'];
  122.         $para_sort['sec_id'] = $para['sec_id'];
  123.         $para_sort['notify_data'] = $para['notify_data'];
  124.         return $para_sort;
  125.     }
  126.     
  127.     /**
  128.      * 获取返回时的签名验证结果
  129.      * @param $para_temp 通知返回来的参数数组
  130.      * @param $sign 返回的签名结果
  131.      * @param $isSort 是否对待签名数组排序
  132.      * @return 签名验证结果
  133.      */
  134.     function getSignVeryfy($para_temp, $sign, $isSort) {
  135.         //除去待签名参数数组中的空值和签名参数
  136.         $para = paraFilter($para_temp);
  137.         
  138.         //对待签名参数数组排序
  139.         if($isSort) {
  140.             $para = argSort($para);
  141.         } else {
  142.             $para = sortNotifyPara($para);
  143.         }
  144.         
  145.         //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
  146.         $prestr = createLinkstring($para);
  147.         
  148.         $isSgin = false;
  149.         switch (strtoupper(trim($this->alipay_config['sign_type']))) {
  150.             case "MD5" :
  151.                 $isSgin = md5Verify($prestr, $sign, $this->alipay_config['key']);
  152.                 break;
  153.             case "RSA" :
  154.                 $isSgin = rsaVerify($prestr, trim($this->alipay_config['ali_public_key_path']), $sign);
  155.                 break;
  156.             case "0001" :
  157.                 $isSgin = rsaVerify($prestr, trim($this->alipay_config['ali_public_key_path']), $sign);
  158.                 break;
  159.             default :
  160.                 $isSgin = false;
  161.         }
  162.         
  163.         return $isSgin;
  164.     }

  165.     /**
  166.      * 获取远程服务器ATN结果,验证返回URL
  167.      * @param $notify_id 通知校验ID
  168.      * @return 服务器ATN结果
  169.      * 验证结果集:
  170.      * invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
  171.      * true 返回正确信息
  172.      * false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
  173.      */
  174.     function getResponse($notify_id) {
  175.         $transport = strtolower(trim($this->alipay_config['transport']));
  176.         $partner = trim($this->alipay_config['partner']);
  177.         $veryfy_url = '';
  178.         if($transport == 'https') {
  179.             $veryfy_url = $this->https_verify_url;
  180.         }
  181.         else {
  182.             $veryfy_url = $this->http_verify_url;
  183.         }
  184.         $veryfy_url = $veryfy_url."partner=" . $partner . "¬ify_id=" . $notify_id;
  185.         $responseTxt = getHttpResponseGET($veryfy_url, $this->alipay_config['cacert']);
  186.         
  187.         return $responseTxt;
  188.     }
  189. }
  190. ?>

wemall官网地址:

原文详情地址:

wemall doraemonAndroid app商城详情地址:

WeMall - 开源微商城 微信商城 商城源码 分销商城 b2b2c商城系统

wemall

阅读(920) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~