public function callback() { Log::record('cftpay callback get:' . print_r($_GET, true)); Log::save(); // 由于二级域名redirect的原因,我们会自动在GET参数里添加shop=merchant_code,需要显示的去掉该参数 unset($_GET['shop']); unset($_GET['_URL_']); $out_trade_no = $_GET['sp_billno']; $transaction_id = $_GET['transaction_id']; if (empty($out_trade_no) || empty($transaction_id)) { echo 'fail'; exit; } // verify whether trade record existing in our db for <order_sn> $trade = M('b2c_cfttrade')->where(array('order_sn' => $out_trade_no, 'transaction_id' => $transaction_id))->find(); if (empty($trade)) { Log::record('cftpay callback non existing order_sn get:' . print_r($_GET, true)); Log::save(); $this->error('非法订单号', U('Wap/Shop/error')); } $DECODED_GET = array(); foreach ($_GET as $k => $v) { $DECODED_GET[$k] = urldecode($v); } import("@.ORG.CftWapPayHelper"); // url signature verification $cftWapPayHelper = new CftWapPayHelper($trade['partnerId'], $trade['partnerkey']); foreach ($DECODED_GET as $k => $v) { $cftWapPayHelper->setParameter($k, $v); } if (!$cftWapPayHelper->isTenpaySign()) { // sign mismatch Log::record('cftpay callback url sign mismatch: .GET:' . print_r($_GET, true)); Log::save(); echo 'fail'; exit; } Log::record('cftpay callback url sign verification passed!', Log::INFO); Log::save(); $audit['trade_callback_timestamp'] = time(); $audit['trade_callback_times'] = $trade['trade_callback_times'] + 1; M('b2c_cfttrade')->where(array('id' => $trade['id']))->save($audit); $host_name = C('wx_handler_server'); // update trade table for tracking if ($trade['n_pay_result'] == 0) { $redirect = WapAction::generatePayResultUrl('Shop/my', $trade['token'], array('token' => $trade['token'], 'wecha_id' => $trade['wecha_id'], 'success' => 1)); $this->redirect($redirect); //$this->success('交易成功',U('Wap/Shop/index',array('shop'=> $trade['token'],'wecha_id'=>$trade['wecha_id']))); } else { $redirect = WapAction::generatePayResultUrl('Shop/my', $trade['token'], array('token' => $trade['token'], 'wecha_id' => $trade['wecha_id'], 'success' => 0)); $this->redirect($redirect); //$this->error('交易失败',U('Wap/Shop/index',array('shop'=> $trade['token'],'wecha_id'=>$trade['wecha_id']))); } }
public function cftpay() { $order_sn = $_GET['order_sn']; $token = $this->token; $wecha_id = $this->wechat_id; Log::record('startCftpay: ' . $token . ':' . $order_sn . ':' . $wecha_id); Log::save(); if (empty($order_sn) || empty($token)) { $this->error('请输入订单号'); } $order = M('b2c_order')->where(array('sn' => $order_sn, 'token' => $token, 'status' => 1))->find(); if (!$order) { $this->error('订单号不正确'); } $shop = M('b2c_shop')->where(array('token' => $token))->find(); if (!$shop) { $this->error('商城不存在'); } $payment_where = array('token' => $token, 'pay_code' => 'cftpay'); if (!empty($this->branch_id)) { $payment_where['branch_id'] = $this->branch_id; } $payment = M('b2c_payment')->where($payment_where)->find(); $wxpay_config = unserialize($payment['pay_config']); if (empty($wxpay_config)) { $this->error('商家信息设置有误!请联系商家客服!'); } $partnerId = $wxpay_config['partnerId']; $partnerKey = $wxpay_config['partnerKey']; // cft pay init parameter list $ver = '2.0'; $charset = '1'; $bank_type = '0'; $desc = $this->getOrderDesc($order['order_id']); // purchaser_id $bargainor_id = $partnerId; $sp_billno = $order_sn; $total_fee = intval(floatval($order['price']) * 100); //分 $fee_type = "1"; $notify_url = $this->generatePayUrl('cftpay/notify'); $callback_url = $this->generatePayUrl('cftpay/callback'); // attach //$time_start = date('YmdHs', time()); // time_expire // add audit for Cft Pay. $trade = M('b2c_cfttrade')->where(array('order_sn' => $order_sn, 'token' => $token))->find(); if ($trade['n_transaction_id']) { $this->error('已支付'); } import("@.ORG.CftWapPayHelper"); $cftWapPayHelper = new CftWapPayHelper($partnerId, $partnerKey); $cftWapPayHelper->setParameter('ver', $ver); $cftWapPayHelper->setParameter('charset', $charset); $cftWapPayHelper->setParameter('bank_type', $bank_type); $cftWapPayHelper->setParameter('desc', $desc); $cftWapPayHelper->setParameter('bargainor_id', $bargainor_id); $cftWapPayHelper->setParameter('sp_billno', $sp_billno); $cftWapPayHelper->setParameter('total_fee', strval($total_fee)); $cftWapPayHelper->setParameter('fee_type', $fee_type); $cftWapPayHelper->setParameter('notify_url', $notify_url); $cftWapPayHelper->setParameter('callback_url', $callback_url); $cft_tokenId = $cftWapPayHelper->getTokenId(); Log::record('cftpay start token:' . $token . ' outorder:' . $order_sn . ' wecha_id:' . $wecha_id . ' token_id:' . $cft_tokenId, Log::INFO); Log::save(); if (empty($cft_tokenId)) { $this->error('服务器忙!请刷新重试!'); } if ($trade == null) { $time = time(); // 微信参数 $data['token'] = $token; $data['wecha_id'] = $wecha_id; // 协议参数 $data['partnerId'] = $partnerId; $data['partnerkey'] = $partnerKey; // 订单详情 $data['order_sn'] = $order_sn; $data['ver'] = $ver; $data['charset'] = $charset; $data['bank_type'] = $bank_type; $data['desc'] = $desc; $data['total_fee'] = $total_fee; $data['fee_type'] = $fee_type; $data['token_id'] = $cft_tokenId; // 订单状态追踪 $data['create_time'] = $time; $data['trade_start_times'] = 1; $ret = M('b2c_cfttrade')->add($data); } else { $ret = M('b2c_cfttrade')->where(array('id' => $trade['id']))->setInc('trade_start_times'); } if ($ret === FALSE) { Log::record('cftpay fail.r/w db fail. order_sn:' . $order_sn . ' err:' . M('b2c_cfttrade')->getDbError()); Log::save(); $this->error('服务器忙!请稍后重试!'); } header("Location:" . "https://wap.tenpay.com/cgi-bin/wappayv2.0/wappay_gate.cgi?token_id=" . $cft_tokenId); }