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 return_url()
 {
     $out_trade_no = $_GET['out_trade_no'];
     Log::record("return url:" . print_r($_GET, true), Log::INFO);
     $shop = null;
     $trade = null;
     if ($out_trade_no) {
         $Model = new Model();
         // 实例化一个model对象 没有对应任何数据表
         $shop = $Model->query("select o.token, o.wecha_id, p.pay_config  from tp_b2c_order as o JOIN tp_b2c_payment as p on p.token = o.token where p.pay_code ='alipay' and o.sn = '{$out_trade_no}'");
         if ($shop == null) {
             Log::record("Illegle order sn:" . $out_trade_no, Log::NOTICE);
             $this->error('非法订单号', U('Wap/Shop/error'));
         }
         if (is_array($shop) && is_string($shop[0]['pay_config'])) {
             $store = unserialize($shop[0]['pay_config']);
             $shop[0]['pay_account'] = $store['pay_account'];
             //合作身份者id,以2088开头的16位纯数字
             $shop[0]['partner'] = $store['alipay_pid'];
             //安全检验码,以数字和字母组成的32位字符
             //如果签名方式设置为“MD5”时,请设置该参数
             $shop[0]['key'] = $store['alipay_key'];
         }
     }
     Log::record("shop_config:" . print_r($shop, true), Log::INFO);
     import("@.ORG.AliWapPay.AlipayNotify");
     $alipayNotify = new AlipayNotify($this->setconfig($shop[0]['partner'], $shop[0]['key']));
     $verify_result = $alipayNotify->verifyReturn();
     if ($verify_result) {
         //商户订单号
         $out_trade_no = $_GET['out_trade_no'];
         //支付宝交易号
         $trade_no = $_GET['trade_no'];
         //交易状态
         $trade_status = $_GET['result'];
         //用户付款时间
         $gmt_payment_time = time();
         $trade_db = M('b2c_trade');
         $trade_where = array('order_sn' => $out_trade_no);
         $trade = $trade_db->field('trade_id', 'token', 'trade_no')->where($trade_where)->find();
         Log::record('return url: status:' . $trade_status . ' trade_no:' . $trade['trade_no'], Log::INFO);
         Log::save();
         if ($trade_status == 'success' && $trade && empty($trade['trade_no'])) {
             $data = array('status' => 2, 'trade_no' => $trade_no, 'alipay_create_time' => time(), 'payment_time' => $gmt_payment_time);
             $ret = $trade_db->where($trade_where)->save($data);
             if ($ret) {
                 //2 是订单已付款
                 $order_ret = M('b2c_order')->where(array('sn' => $out_trade_no))->save(array('status' => 2));
                 Log::save();
                 //echo "交易成功<br />";
                 $redirect = WapAction::generatePayResultUrl('Shop/my', $shop[0]['token'], array('token' => $shop[0]['token'], 'wecha_id' => $shop[0]['wecha_id'], 'success' => 1));
                 $this->redirect($redirect);
                 //$this->success('交易成功',U('Wap/Shop/index',array('shop'=> $trade['token'])));
             }
         }
         if ($trade_status == 'success') {
             $redirect = WapAction::generatePayResultUrl('Shop/my', $shop[0]['token'], array('token' => $shop[0]['token'], 'wecha_id' => $shop[0]['wecha_id'], 'success' => 1));
             $this->redirect($redirect);
         } else {
             $redirect = WapAction::generatePayResultUrl('Shop/my', $shop[0]['token'], array('token' => $shop[0]['token'], 'wecha_id' => $shop[0]['wecha_id'], 'success' => 0));
             $this->redirect($redirect);
         }
     } else {
         Log::save();
         //echo "支付失败<br />";
         $redirect = WapAction::generatePayResultUrl('Shop/my', $shop[0]['token'], array('token' => $shop[0]['token'], 'wecha_id' => $shop[0]['wecha_id'], 'success' => 0));
         $this->redirect($redirect);
         //$this->error('支付失败 ,请联系客服,为您处理',U('Wap/Shop/index'));
     }
 }