|
@@ -12,6 +12,117 @@ require_once (BASE_DATA_PATH . "/api/cmbpay/Cmb.class.php");
|
|
|
|
|
|
use \Cmb;
|
|
|
|
|
|
+class NotifyData
|
|
|
+{
|
|
|
+ private $mParam;
|
|
|
+ public function __construct($param)
|
|
|
+ {
|
|
|
+ $this->mParam = $param;
|
|
|
+ }
|
|
|
+ private function success()
|
|
|
+ {
|
|
|
+ return ($this->mParam['Succeed'] =='Y');
|
|
|
+ }
|
|
|
+
|
|
|
+ private function filter_param($param)
|
|
|
+ {
|
|
|
+ $filter = [];
|
|
|
+ foreach ($param as $key => $value)
|
|
|
+ {
|
|
|
+ if($key != 'Signature') {
|
|
|
+ $filter[$key] = ($value);//urlencode
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $pos = 0;
|
|
|
+ $count = count($filter);
|
|
|
+
|
|
|
+ $str = '';
|
|
|
+ foreach ($filter as $key => $value)
|
|
|
+ {
|
|
|
+ $str .= "{$key}=" . "{$value}";
|
|
|
+ if($pos != $count -1) {
|
|
|
+ $str .= "&";
|
|
|
+ }
|
|
|
+ $pos++;
|
|
|
+ }
|
|
|
+ return $str;
|
|
|
+ }
|
|
|
+ private function sign()
|
|
|
+ {
|
|
|
+ $strsign = $this->mParam['Signature'];
|
|
|
+ $signAsc = explode("|", $strsign);
|
|
|
+ $sign = '';
|
|
|
+ foreach ($signAsc as $v) {
|
|
|
+ if ($v ==='') {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $sign .= chr($v);
|
|
|
+ }
|
|
|
+
|
|
|
+ return $sign;
|
|
|
+ }
|
|
|
+
|
|
|
+ private function public_key()
|
|
|
+ {
|
|
|
+ $pub_key = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALuUIwMGhvbpCwYzKCMzvSMQiLAAj5y74cN09N1TXVONPWhvLWkuzEPSd1ogPJLWiVyEG7gEIBT3zTlCV+NMou0CAwEAAQ==';
|
|
|
+ $pk = chunk_split($pub_key, 64, "\n");
|
|
|
+ $pk = "-----BEGIN PUBLIC KEY-----\n{$pk}-----END PUBLIC KEY-----\n";
|
|
|
+ return $pk;
|
|
|
+ }
|
|
|
+ public function check()
|
|
|
+ {
|
|
|
+ if($this->success() == false) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ $sign = $this->sign();
|
|
|
+ $pk = $this->public_key();
|
|
|
+ $pkid = openssl_pkey_get_public($pk);
|
|
|
+ $content = $this->filter_param($this->mParam);
|
|
|
+ $ok = openssl_verify($content, $sign, $pkid, OPENSSL_ALGO_SHA1);
|
|
|
+ openssl_free_key($pkid);
|
|
|
+
|
|
|
+ return $ok;
|
|
|
+ }
|
|
|
+ private function substr($arr,$src)
|
|
|
+ {
|
|
|
+ $len = strlen($src);
|
|
|
+ $ar_len = 0;
|
|
|
+ foreach ($arr as $key => $value) {
|
|
|
+ $ar_len += intval($value);
|
|
|
+ }
|
|
|
+ if($ar_len > $len) return false;
|
|
|
+
|
|
|
+ $result = [];
|
|
|
+ $pos = 0;
|
|
|
+ foreach ($arr as $key => $len)
|
|
|
+ {
|
|
|
+ $val = substr($src,$pos,$len);
|
|
|
+ $pos += $len;
|
|
|
+
|
|
|
+ $result[$key] = $val;
|
|
|
+ }
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+ public function format()
|
|
|
+ {
|
|
|
+ $body = $this->mParam['MerchantPara'];
|
|
|
+ $params = preg_split('/\||:/', $body);
|
|
|
+
|
|
|
+ $result = [];
|
|
|
+ for ($i = 0; $i < count($params); ++$i) {
|
|
|
+ $key = $params[$i];
|
|
|
+ $val = $params[++$i];
|
|
|
+ $result[$key] = $val;
|
|
|
+ }
|
|
|
+ $ar_key = array("BranchID" => 4,"CoNo" => 6, "Date" => 8,"trade_no" => 20);
|
|
|
+ $msg = $this->substr($ar_key,$this->mParam['Msg']);
|
|
|
+ $result['trade_no'] = $msg['trade_no'];
|
|
|
+
|
|
|
+ return $result;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
class cmbpay implements IPay
|
|
|
{
|
|
|
const pay_url = 'http://61.144.248.29:801/netpayment/BaseHttp.dll?PrePayEUserP';
|
|
@@ -42,9 +153,14 @@ class cmbpay implements IPay
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-
|
|
|
public function on_notify($param)
|
|
|
{
|
|
|
+ $nofity = new NotifyData($param);
|
|
|
+ if($nofity->check()) {
|
|
|
+ return $nofity->format();
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public function gen_pay($pay_sn, $cents,$order_sn,$subject)
|
|
@@ -55,11 +171,11 @@ class cmbpay implements IPay
|
|
|
$payprice = $cents / 100;
|
|
|
$time = time();
|
|
|
$date = date('Ymd', $time);
|
|
|
-
|
|
|
- $param = $this->gen_param($time,$payprice,$pay_sn,$order_sn,$bill_no);
|
|
|
+ $user_id = $_SESSION['member_id'];
|
|
|
+ $attach = "pay_sn:{$pay_sn}|order_sn:{$order_sn}|member_id:{$user_id}";
|
|
|
+ $param = $this->gen_param($time,$payprice,$attach,$bill_no);
|
|
|
$code = $this->genMerchantCode($param);
|
|
|
|
|
|
- $user_id = $_SESSION['member_id'];
|
|
|
$data = [
|
|
|
'BranchID' => $config['BranchID'],
|
|
|
'CoNo' => $config['CoNo'],
|
|
@@ -68,7 +184,7 @@ class cmbpay implements IPay
|
|
|
'Date' => $date,
|
|
|
'ExpireTimeSpan' => '30',
|
|
|
'MerchantUrl' => self::pay_notify_url(),
|
|
|
- 'MerchantPara' => "pay_sn={$pay_sn}#order_sn={$order_sn}#member_id={$user_id}",
|
|
|
+ 'MerchantPara' => $attach,
|
|
|
'MerchantCode' => $code,
|
|
|
'MerchantRetUrl' => "",
|
|
|
];
|
|
@@ -87,7 +203,7 @@ class cmbpay implements IPay
|
|
|
return array("req_url" => self::pay_url,"data" => $strParam);
|
|
|
}
|
|
|
|
|
|
- private function gen_param($time,$payprice,$pay_sn,$order_sn,$bill_no)
|
|
|
+ private function gen_param($time,$payprice,$attach,$bill_no)
|
|
|
{
|
|
|
$date = date('Ymd', $time);
|
|
|
$seq = $date . $bill_no;
|
|
@@ -101,7 +217,7 @@ class cmbpay implements IPay
|
|
|
'strCono' => $config['CoNo'],
|
|
|
'strBillNo' => $bill_no,
|
|
|
'strAmount' => "{$payprice}",
|
|
|
- 'strMerchantPara' => "pay_sn={$pay_sn}#order_sn={$order_sn}#member_id={$user_id}",
|
|
|
+ 'strMerchantPara' => $attach,
|
|
|
'strMerchantUrl' => self::pay_notify_url(),
|
|
|
'strPayerID' => "{$user_id}",
|
|
|
'strPayeeID' => '',
|