1. 程式人生 > >wemall app商城原始碼Android之支付寶通知處理類

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

       wemall-mobile是基於WeMall的Android app商城,只需要在原商城目錄下上傳介面檔案即可完成服務端的配置,客戶端可定製修改。本文分享wemall app商城原始碼Android之處理支付寶各介面通知返回,供技術員參考學習。

      以下程式碼只是為了方便商戶測試而提供的樣例程式碼,商戶可以根據自己網站的需要,按照技術文件編寫,並非一定要使用該程式碼,該程式碼僅供學習和研究支付寶介面使用,只是提供一個參考,除錯通知返回時,可檢視或改寫log日誌的寫入TXT裡的資料,來檢查通知返回是否正常。

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

<?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 . "¬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-doraemon/commit/e8f303df5663dc69fe47bb9623222149d40e3956

wemall doraemonAndroid app商城詳情地址:http://www.koahub.com/home/product/55

WeMall - 開源微商城 微信商城 商城原始碼 分銷商城 b2b2c商城系統

wemall