Ejemplo n.º 1
0
 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";
     }
 }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
0
 /**
  * 返回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 '签名不正确';
     }
 }
Ejemplo n.º 4
0
 /**
  * 返回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
 }
Ejemplo n.º 5
0
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'];
        //买家支付宝帐号
Ejemplo n.º 6
0
 public static function getDataForXML($res_data, $node)
 {
     return getDataForXML($res_data, $node);
 }
Ejemplo n.º 7
0
 /**
  * 返回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 '签名不正确';
     }
 }
Ejemplo n.º 8
0
// 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
// 该页面调试工具请使用写文本函数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("");
    }