public function actionAlipayNotify() { $alipay = new Mb_Pay_Alipay_Notify(Mb_Pay_Alipay_Config::PARTNER, Mb_Pay_Alipay_Config::KEY, Mb_Pay_Alipay_Config::SEC_ID, Mb_Pay_Alipay_Config::INPUT_CHARSET); $verify_result = $alipay->notify_verify(); if ($verify_result) { $res_data = $_POST['notify_data']; $order_code = Mb_Pay_Alipay_Alipay::getDataForXML($res_data, '/notify/out_trade_no'); $amount = Mb_Pay_Alipay_Alipay::getDataForXML($res_data, '/notify/total_fee'); $trade_status = getDataForXML($res_data, '/notify/trade_status'); if ($trade_status == 'TRADE_SUCCESS') { echo "success"; } else { echo "fail"; } } else { echo "fail"; } }
public function actionPaycallback_alipay() { global $_PAYMENT_RESPONSE; $notify_data = $_REQUEST['notify_data']; $sign = base64_decode($_REQUEST['sign']); $src = $_REQUEST['source']; if (empty($src) || $src != 'changba') { $publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCRpkj69E+aMmGupqSSQkHlka2s8S8yJYT0Xnu/kH1yLRsgVFqsLdvtcJ87F0y4JMVVqZq2OhL7CY9WBXa3Jo5tdJii3ZFFX3k6e0C8Ksp6ihh/zVmsxgTJAHW+IUuQ8KJJFFiGHlUfG3/6BFk4CbsrhedFMFlGgGnXY/Et5jkM7QIDAQAB'; } else { $publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDyCkLAAbis1kNwyfUy9cJtM+Sn314B/4xgH6mhksUlIGLQK4Ns+wa2+2V6/p5jkzelgvZymWdMJeSJkEu8zMVm5meuac1CHVesgXuR5rQLyO7QevRzxo1rTqkD5Fz7DxwezK/uMSgU9mbAqvc7QR9g2zSWod13zLqo70mHpWRBLwIDAQAB'; } $publicKey = model_Util::rsa_convert_publicKey($publicKey); $verify = model_Util::rsa_verify("notify_data={$notify_data}", $sign, $publicKey); if (!$verify) { echo "fail"; $_PAYMENT_RESPONSE = array('retcode' => 1000, 'retmsg' => "签名验证失败!"); return; } echo "success"; $trade_status = getDataForXML($notify_data, "/notify/trade_status"); if ($trade_status != "TRADE_FINISHED" && $trade_status != "TRADE_SUCCESS") { //没有完成支付宝交易 如果这里不返回success是否会继续请求 $_PAYMENT_RESPONSE = array('retcode' => 1006, 'retmsg' => "通知成功,交易状态:{$trade_status}"); return; } $out_trade_no = getDataForXML($notify_data, "/notify/out_trade_no"); $extInfo = explode('_', $out_trade_no); //uid,section,transaction_id 这个字段只有64位估计放不下这么多数据 //mix平台合区修复支付不到账 by zhangjun if (count($extInfo) == 4) { //合区前 1_s1_token 合区后 s1_1_s1000_token $new_id = array_shift($extInfo); $extInfo[0] = $new_id . '_' . $extInfo[0]; } $um = $extInfo[0]; if (is_null($um)) { $_PAYMENT_RESPONSE = array('retcode' => 1001, 'retmsg' => "用户不存在"); return; } PL_Session::$usecookie = false; $_REQUEST['cid'] = PL_Session::gencid($um, $extInfo[1]); $player = getApp()->getPlayer(); $lock = DbConfig::getRedis('rank'); $lk = "pay_lock_{$player->uid}_{$player->section_id}"; $now = time(); $res = $lock->SETNX($lk, $now); if ($res) { $lock->SETEX($lk, 20, $now); } else { return $this->response(array('ErrorCode' => 0, 'ErrorDesc' => "订单处理锁定!")); } $transaction_id = $extInfo[2]; $mon = getApp()->getPaymentMongoConnection(); $payment_info = $mon->findOne(array('_u' => $player->uid, 'transaction_id' => $transaction_id)); if (empty($payment_info)) { $_PAYMENT_RESPONSE = array('ErrorCode' => 1003, 'ErrorDesc' => "账单[{$transaction_id}]不存在"); return; } else { if ($payment_info['status'] == StatusCode::payment_finished || $payment_info['status'] == StatusCode::payment_failed) { $_PAYMENT_RESPONSE = array('ErrorCode' => 1004, 'ErrorDesc' => "重复订单{$transaction_id}已经处理"); return; } $fee = getDataForXML($notify_data, "/notify/total_fee"); if (!$this->checkCash($payment_info['product_id'], $fee)) { return $this->response(array('ErrorCode' => 1006, 'ErrorDesc' => "订单{$transaction_id}充值金额有误")); } } // 订单上次处理异常 或者 新的订单 $ret = $player->process_payment($payment_info); $lock->del($lk); if ($ret['s'] == StatusCode::ok) { $_PAYMENT_RESPONSE = array('ErrorCode' => 0, 'ErrorDesc' => "订单{$transaction_id}处理成功"); } else { $_PAYMENT_RESPONSE = array('ErrorCode' => 1005, 'ErrorDesc' => "订单{$transaction_id}处理失败," . $ret['msg']); } return; }
/** * 返回token参数 * 参数 result 需要先urldecode */ function getToken($result) { $result = urldecode($result); // URL转码 $Arr = explode('&', $result); // 根据 & 符号拆分 $temp = array(); // 临时存放拆分的数组 $myArray = array(); // 待签名的数组 // 循环构造key、value数组 for ($i = 0; $i < count($Arr); $i++) { $temp = explode('=', $Arr[$i], 2); $myArray[$temp[0]] = $temp[1]; } $sign = $myArray['sign']; // 支付宝返回签名 $myArray = para_filter($myArray); // 拆分完毕后的数组 $sort_array = arg_sort($myArray); // 排序数组 $this->mysign = build_mysign($sort_array, $this->_key, $this->sign_type); // 构造本地参数签名,用于对比支付宝请求的签名 if ($this->mysign == $sign) { return getDataForXML($myArray['res_data'], '/direct_trade_create_res/request_token'); // 返回token } else { echo '签名不正确'; // 当判断出签名不正确,请不要验签通过 return '签名不正确'; } }
/** * 返回token参数 * 参数 result 需要先urldecode */ private function getToken($result) { $result = urldecode($result); // URL转码 $Arr = explode('&', $result); // 根据 & 符号拆分 $temp = array(); // 临时存放拆分的数组 $myArray = array(); // 待签名的数组 // 循环构造key、value数组 for ($i = 0; $i < count($Arr); $i++) { $temp = explode('=', $Arr[$i], 2); $myArray[$temp[0]] = $temp[1]; } $sign = $myArray['sign']; // 支付宝返回签名 $myArray = para_filter($myArray); // 拆分完毕后的数组 $sort_array = arg_sort($myArray); // 排序数组 $calcSign = build_mysign($sort_array, $this->partnerKey, $this->configSecId); // 构造本地参数签名,用于对比支付宝请求的签名 if ($calcSign != $sign) { // 当判断出签名不正确,请不要验签通过 printLog('alipayWap Token 签名不正确 sign[' . $sign . '] calcSign[' . $calcSign . ']', 'PAYMENT', \Core\Log\Base::ERROR); return null; } return getDataForXML($myArray['res_data'], '/direct_trade_create_res/request_token'); // 返回token }
require_once "class/alipay_notify.php"; //存在此次交易的缓存文件时,则调用,没有则去数据库查询 $zhifubaojiaoyihao = $_POST['trade_no']; if (file_exists("config/" . $zhifubaojiaoyihao . "_cache_code.php")) { include_once "config/" . $zhifubaojiaoyihao . "_cache_code.php"; } else { $data_back = array(); $out = new paydataClass(); $data_back = $out->detail_back($zhifubaojiaoyihao); $partner = $data_back['partner']; $key = $data_back['key']; $sec_id = $data_back['sec_id']; $_input_charset = $data_back['_input_charset']; } $alipay = new alipay_notify($partner, $key, $sec_id, $_input_charset); // 构造通知函数信息 $verify_result = $alipay->notify_verify(); // 计算得出通知验证结果 if ($verify_result) { $status = getDataForXML($_POST['notify_data'], '/notify/trade_status'); // 返回token if ($status == 'TRADE_FINISHED') { // 交易成功结束 $mydingdan = $_POST['out_trade_no']; // 外部交易号 $myresult = "success"; // 订单状态,是否成功 $mytrade_no = $_POST['trade_no']; // 交易号 $buyer_email = $_POST['buyer_email']; //买家支付宝帐号
public static function getDataForXML($res_data, $node) { return getDataForXML($res_data, $node); }
/** * 返回token参数 * 参数 result 需要先urldecode */ function getToken($result) { //URL转码 $result = urldecode($result); //根据 & 符号拆分 $Arr = explode('&', $result); //临时存放拆分的数组 $temp = array(); //待签名的数组 $myArray = array(); //循环构造key、value数组 for ($i = 0; $i < count($Arr); $i++) { $temp = explode('=', $Arr[$i], 2); $myArray[$temp[0]] = $temp[1]; } //需要先解密res_data $myArray['res_data'] = decrypt($myArray['res_data']); //获取返回的RSA签名 $sign = $myArray['sign']; //去sign,去空值参数 $myArray = para_filter($myArray); //排序数组 $sort_array = arg_sort($myArray); //拼凑参数链接 & 连接 $prestr = create_linkstring($sort_array); //返回布尔值,是否验签通过 $isverify = verify($prestr, $sign); //判断签名是否正确 if ($isverify) { //返回token return getDataForXML($myArray['res_data'], '/direct_trade_create_res/request_token'); } else { //当判断出签名不正确,请不要验签通过 return '签名不正确'; } }
// 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。 // 该页面调试工具请使用写文本函数log_result,该函数已被默认关闭,见alipay_notify.php中的函数notify_verify // TRADE_FINISHED(表示交易已经成功结束); // 该服务器异步通知页面面主要功能是:对于返回页面(return_url.php)做补单处理。如果没有收到该页面返回的 success // 信息,支付宝会在24小时内按一定的时间策略重发通知 // /////////////////////////////////// require_once "class/alipay_notify.php"; require_once "alipay_config.php"; // 构造通知函数信息 $alipay = new alipay_notify($partner, $sec_id, $_input_charset); // 计算得出通知验证结果 $verify_result = $alipay->notify_verify(); // 判断验签是否成功 if ($verify_result) { // 解密notify_data数据,并获得该xml节点的状态 $status = getDataForXML(decrypt($_POST['notify_data']), '/notify/trade_status'); // 判断交易是否完成 if ($status == 'TRADE_FINISHED') { // 在判断交易完成后,必须在页面输出success echo "success"; // 记录日志 // log_result("success"); /** * ********************************这里配置商户的业务逻辑************************************ */ } else { // 交易未完成 echo "fail"; // 记录日志 log_result(""); }