/** * 微信支付接口调用 */ 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 '统一下单支付单信息 '; // $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 "$key : $value " ; } } /* 支付成功回调函数 */ 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 ; } } ?> |