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);
 }