资讯专栏INFORMATION COLUMN

wemall app商城源码Android之支付宝通知处理类

Crazy_Coder / 1145人阅读

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

   wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。本文分享wemall app商城源码Android之处理支付宝各接口通知返回,供技术员参考学习。
  以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码,该代码仅供学习和研究支付宝接口使用,只是提供一个参考,调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常。

wemall官网地址:http://www.wemallshop.com

alipay_config = $alipay_config;
    }
    function AlipayNotify($alipay_config) {
        $this->__construct($alipay_config);
    }
    /**
     * 针对notify_url验证消息是否是支付宝发出的合法消息
     * @return 验证结果
     */
    function verifyNotify(){
        if(empty($_POST)) {//判断POST来的数组是否为空
            return false;
        }
        else {
            
            //对notify_data解密
            $decrypt_post_para = $_POST;
            if ($this->alipay_config["sign_type"] == "0001") {
                $decrypt_post_para["notify_data"] = rsaDecrypt($decrypt_post_para["notify_data"], $this->alipay_config["private_key_path"]);
            }
            
            //notify_id从decrypt_post_para中解析出来(也就是说decrypt_post_para中已经包含notify_id的内容)
            $doc = new DOMDocument();
            $doc->loadXML($decrypt_post_para["notify_data"]);
            $notify_id = $doc->getElementsByTagName( "notify_id" )->item(0)->nodeValue;
            
            //获取支付宝远程服务器ATN结果(验证是否是支付宝发来的消息)
            $responseTxt = "true";
            if (! empty($notify_id)) {$responseTxt = $this->getResponse($notify_id);}
            
            //生成签名结果
            $isSign = $this->getSignVeryfy($decrypt_post_para, $_POST["sign"],false);
            
            //写日志记录
            //if ($isSign) {
            //    $isSignStr = "true";
            //}
            //else {
            //    $isSignStr = "false";
            //}
            //$log_text = "responseTxt=".$responseTxt."
 notify_url_log:isSign=".$isSignStr.",";
            //$log_text = $log_text.createLinkString($_POST);
            //logResult($log_text);
            
            //验证
            //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
            //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
            if (preg_match("/true$/i",$responseTxt) && $isSign) {
                return true;
            } else {
                return false;
            }
        }
    }
    
    /**
     * 针对return_url验证消息是否是支付宝发出的合法消息
     * @return 验证结果
     */
    function verifyReturn(){
        if(empty($_GET)) {//判断GET来的数组是否为空
            return false;
        }
        else {
            //生成签名结果
            $isSign = $this->getSignVeryfy($_GET, $_GET["sign"],true);
            
            //写日志记录
            //if ($isSign) {
            //    $isSignStr = "true";
            //}
            //else {
            //    $isSignStr = "false";
            //}
            //$log_text = "return_url_log:isSign=".$isSignStr.",";
            //$log_text = $log_text.createLinkString($_GET);
            //logResult($log_text);
            
            //验证
            //$responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
            //isSign的结果不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
            if ($isSign) {
                return true;
            } else {
                return false;
            }
        }
    }
    
    /**
     * 解密
     * @param $input_para 要解密数据
     * @return 解密后结果
     */
    function decrypt($prestr) {
        return rsaDecrypt($prestr, trim($this->alipay_config["private_key_path"]));
    }
    
    /**
     * 异步通知时,对参数做固定排序
     * @param $para 排序前的参数组
     * @return 排序后的参数组
     */
    function sortNotifyPara($para) {
        $para_sort["service"] = $para["service"];
        $para_sort["v"] = $para["v"];
        $para_sort["sec_id"] = $para["sec_id"];
        $para_sort["notify_data"] = $para["notify_data"];
        return $para_sort;
    }
    
    /**
     * 获取返回时的签名验证结果
     * @param $para_temp 通知返回来的参数数组
     * @param $sign 返回的签名结果
     * @param $isSort 是否对待签名数组排序
     * @return 签名验证结果
     */
    function getSignVeryfy($para_temp, $sign, $isSort) {
        //除去待签名参数数组中的空值和签名参数
        $para = paraFilter($para_temp);
        
        //对待签名参数数组排序
        if($isSort) {
            $para = argSort($para);
        } else {
            $para = sortNotifyPara($para);
        }
        
        //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
        $prestr = createLinkstring($para);
        
        $isSgin = false;
        switch (strtoupper(trim($this->alipay_config["sign_type"]))) {
            case "MD5" :
                $isSgin = md5Verify($prestr, $sign, $this->alipay_config["key"]);
                break;
            case "RSA" :
                $isSgin = rsaVerify($prestr, trim($this->alipay_config["ali_public_key_path"]), $sign);
                break;
            case "0001" :
                $isSgin = rsaVerify($prestr, trim($this->alipay_config["ali_public_key_path"]), $sign);
                break;
            default :
                $isSgin = false;
        }
        
        return $isSgin;
    }

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

wemall官网地址:http://www.wemallshop.com
原文详情地址:http://Git.oschina.NET/zzunet...
wemall doraemonAndroid app商城详情地址:http://www.koahub.com/home/pr...
WeMall - 开源微商城 微信商城 商城源码 分销商城 b2b2c商城系统

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22132.html

相关文章

  • wemall app商城源码Android支付接口公用函数

    摘要:本文分享商城源码之支付宝接口公用函数,该类是请求通知返回两个文件所调用的公用函数核心处理文件,供技术员参考学习。 wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。本文分享wemall app商城源码Android之 支付宝接口公用函数,该类是请求、通知返回两个文件所调用的公用函数核心处理文...

    Lemon_95 评论0 收藏0
  • wemall app商城系统Android支付接口RSA函数

    摘要:本文分享支付宝接口函数签名验签解密等,供技术员参考学习。以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写并非一定要使用该代码,该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。本文分享支付宝接口...

    NusterCache 评论0 收藏0
  • wemall app商城系统Android支付接口RSA函数

    摘要:本文分享支付宝接口函数签名验签解密等,供技术员参考学习。以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写并非一定要使用该代码,该代码仅供学习和研究支付宝接口使用,只是提供一个参考。 wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。本文分享支付宝接口...

    hiyang 评论0 收藏0
  • wemall app商城源码AndroidNative(原生)支付模式一demo

    摘要:本文分享原生支付模式一,供技术员参考学习。官网地址模式一商户按固定格式生成链接二维码,用户扫码后调微信会将和用户发送到商户设置的链接上,商户收到请求生成订单,调用统一支付接口下单提交到微信,微信会返回给商户。 wemall-mobile是基于WeMall的Android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。本文分享Native(原生)支付...

    source 评论0 收藏0
  • wemall app商城源码AndroidListView异步加载网络图片(优化缓存机制)

    摘要:本文分享商城源码之异步加载网络图片优化缓存机制代码信息,供技术员参考学习。采用线程池内存缓存文件缓存内存缓存中网上很多是采用来防止堆溢出,这儿严格限制只能使用最大内存的对下载的图片进行按比例缩放,以减少内存的消耗具体的代码里面说明。 wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改。...

    luqiuwen 评论0 收藏0

发表评论

0条评论

Crazy_Coder

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<