nics 发表于 2017-12-30 07:55:21

PHP后台支付的开发:微信支付和支付宝支付

<?php  

  
/**
  * 微信支付接口调用
  */
  

  
namespace Wine\Controller;
  

  
use Common\Controller\HomebaseController;
  

  
class WxpayController extends HomebaseController {
  

  public function _initialize() {
  parent::_initialize();
  

  Vendor("WxpayAPI/example/log");//订单数据写入日志
  //注: 引入第三方类库中的微信接口文件,对于文件名含有.的,皆用#代替连接才能引入,后缀名不写。
  Vendor("WxpayAPI/example/WxPay#JsApiPay");
  Vendor("WxpayAPI/lib/WxPay#Config");
  Vendor("WxpayAPI/lib/WxPay#Data");
  Vendor("WxpayAPI/lib/WxPay#Exception");
  Vendor("WxpayAPI/lib/WxPay#Notify");
  Vendor("WxpayAPI/lib/WxPay#Api");
  //初始化日志
  $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log');
  $log = \Log::Init($logHandler, 15);
  $this->model = D("Wine/Orders");
  $this->url = MODULE_NAME . '/' . CONTROLLER_NAME . '/index';
  }
  

  /**
  * 显示支付页面
  *
  */
  public function index() {
  // 判断当前订单是否被支付
  $orderid = I("get.o_id", 0, "intval");
  $orderid || $this->error("非法操作!");
  $this->assign('orderid',$orderid);
  $info = $this->model->findone(array("a.id" => $orderid, 'a.status' => array('neq', '-1')));
  $info || $this->error("暂未查询到该订单!");
  //10代表订单待支付的状态
  if ($info['order_status'] != 10) {
  $this->error("订单已支付!");
  }
  //①、获取用户openid
  $tools = new \JsApiPay();
  $openId = $tools->GetOpenid(); #无法使用
  //初始化日志
  \Log::INFO('订单' . var_export($info, true));
  $out_trade_no = \WxPayConfig::MCHID . date("YmdHis");
  $this->model->where(array("id" => $orderid))->save(array('out_trade_no' => $out_trade_no));
  
//      $openId ="123"; #无法使用
  //②、统一下单
  $input = new \WxPayUnifiedOrder();
  $input->SetBody($info['mode_name']);
  $input->SetAttach($orderid);
  $input->SetOut_trade_no($out_trade_no);
  
//      $input->SetTotal_fee($orderArr['total_price']*100);实际支付价格
  $input->SetTotal_fee($info['pay_price']*100); //测试时请将支付价格改为0.01,土豪请避开此注释
  $this->assign('pay_price',$info['pay_price']);
  $input->SetTime_start(date("YmdHis"));
  $input->SetTime_expire(date("YmdHis", time() + 600));
  
//      $input->SetGoods_tag("test");# 优惠券
  $input->SetNotify_url('http://' . $_SERVER['HTTP_HOST'] . "/index.php/Wine/Wxpay/callback"); //回调地址
  $input->SetTrade_type("JSAPI");
  $input->SetOpenid($openId);
  $order = \WxPayApi::unifiedOrder($input);
  
//      echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
  
//      $this->printf_info($order);//打印参数
  $this->assign('o_id',$orderid);
  $this->assign('jsApiParameters', $tools->GetJsApiParameters($order));
  //获取共享收货地址js函数参数
  
//      $this->assign('editAddress', $tools->GetEditAddressParameters());
  $this->display('wxpay');
  exit;
  }
  

  /**
  * 打印输出数组信息
  * @param type $data
  */
  public function printf_info($data) {
  foreach ($data as $key => $value) {
  echo "<font color='#00ff55;'>$key</font> : $value <br/>";
  }
  }
  

  /* 支付成功回调函数 */
  

  public function callback() {
  /* 返回给微信服务器 */
  
//      $mes = array(
  
//            'return_code' => 'SUCCESS',
  
//            'return_msg' => 'OK'
  
//      );
  
//      $this->ajaxReturn($mes, 'XML');
  $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log');
  $log = \Log::Init($logHandler, 15);
  //$streamData = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
  

  $streamData = file_get_contents('php://input');
  if ($streamData != '') {
  $arr = $this->xmlToArray($streamData);
  \Log::INFO('支付' . var_export($arr, true));
  } else {
  $ret = false;
  }
  // 回调值
  if (!empty($arr)) {
  # 数据
  \Log::INFO('数据1' . var_export($arr, true));
  #修改订单状态
  $out_trade_no = $arr['out_trade_no'];
  $newArr = array('order_status' => 11,'status'=>1);
  $this->model->where(array("out_trade_no" => $out_trade_no))->save($newArr);
  $info = $this->model->findone(array("a.out_trade_no" => $out_trade_no, 'a.status' => array('neq', '-1')));
  $sql =$this->model->getLastSql();
  \Log::INFO('数据2' . $sql);
  #添加支付记录pay
  $pay = array(
  'payment_code' => 'wxpay',
  'trade_no'=>$info['order_code'],
  'out_trade_no'=>$out_trade_no,
  'order_id'=>$info['id'],
  'create_time'=>time()
  );
  M('payment_record')->add($pay);
  }
  

  /* 返回给微信服务器 */
  $mes = array(
  'return_code' => 'SUCCESS',
  'return_msg' => 'OK'
  );
  $this->ajaxReturn($mes, 'XML');
  }
  

  //将XML转为array
  public function xmlToArray($xml) {
  //禁止引用外部xml实体
  libxml_disable_entity_loader(true);
  $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
  return $values;
  }
  

  
}
  

  
?>
页: [1]
查看完整版本: PHP后台支付的开发:微信支付和支付宝支付