wemall app商城源碼Android之支付寶通知處理類

wemall-mobile是基於WeMall的Android app商城,只須要在原商城目錄下上傳接口文件便可完成服務端的配置,客戶端可定製修改。本文分享wemall app商城源碼Android之處理支付寶各接口通知返回,供技術員參考學習。
  如下代碼只是爲了方便商戶測試而提供的樣例代碼,商戶能夠根據本身網站的須要,按照技術文檔編寫,並不是必定要使用該代碼,該代碼僅供學習和研究支付寶接口使用,只是提供一個參考,調試通知返回時,可查看或改寫log日誌的寫入TXT裏的數據,來檢查通知返回是否正常。

wemall官網地址:http://www.wemallshop.comphp

<?php
require_once("alipay_core.function.php");
require_once("alipay_rsa.function.php");
require_once("alipay_md5.function.php");

class AlipayNotify {
    /**
     * HTTPS形式消息驗證地址
     */
    var $https_verify_url = 'https://mapi.alipay.com/gateway.do?service=notify_verify&';
    /**
     * HTTP形式消息驗證地址
     */
    var $http_verify_url = 'http://notify.alipay.com/trade/notify_query.do?';
    var $alipay_config;

    function __construct($alipay_config){
        $this->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."\n 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 . "&notify_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商城系統node

相關文章
相關標籤/搜索