微信支付代码演示

浏览:2122 发布日期:2016/11/10 分类:技术分享
微信支付全套代码namespace app\index\controller;

use think\Db;
use think\Log;

/**
* 微信支付
* @author tangtanglove
*/
class Wxpay extends Base
{

    /**
    * 微信支付首页
    * @author tangtanglove
    */
    public function index()
    {
        $uid = session('index_user_auth.uid');
        if (empty($uid)) {
            $this->error('未登录!');
        }
        $order_no     = input('get.order_no');
        $ordersInfo = Db::name('Orders')->where(['order_no'=>$order_no,'uid'=>$uid])->find();
        if(empty($ordersInfo)){
            $this->error('参数错误');
        }
        $this->assign('order_no',$order_no);
        return $this->themeFetch('pay_index');
    }

    /**
    * 微信支付
    * @author tangtanglove
    */
    public function pay()
    {
        $uid = session('index_user_auth.uid');
        if (empty($uid)) {
            $this->error('未登录!');
        }
        $order_no = input('get.order_no');
        $ordersInfo = Db::name('Orders')->where(['order_no'=>$order_no,'uid'=>$uid])->find();

        if(empty($ordersInfo)){
            $this->error('参数错误');
        }

        import('org.util.pay.Wxpay.NativePay');
        import('org.util.pay.Wxpay.Api');
        import('org.util.pay.Wxpay.WxPayConfig');
        import('org.util.pay.Wxpay.Data');
        import('org.util.pay.Wxpay.Exception');
        import('org.util.pay.Wxpay.Notify');

        //模式二
        /**
         * 流程:
         * 1、调用统一下单,取得code_url,生成二维码
         * 2、用户扫描二维码,进行支付
         * 3、支付完成之后,微信服务器会通知支付成功
         * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
        */
        $money         = $ordersInfo['amount']*100;
        // 接收订单状态url
        $notifyUrl     = config('enter_url').'/index/wxpay/notify_url.html';
        $notify     = new \NativePay();
         $input         = new \WxPayUnifiedOrder();
        $input->SetBody('订单号:'.$order_no);
        $input->SetOut_trade_no($order_no);
        $input->SetTotal_fee($money);
        $input->SetTime_start(date("YmdHis",$ordersInfo['createtime']));
        $input->SetNotify_url($notifyUrl);
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id($ordersInfo['id']);

        $result = $notify->GetPayUrl($input);

        if(!$result["code_url"]){
            $this->error('您的订单已支付');
        }
        $codeUrl = $result["code_url"];
        $this->assign('codeUrl',$codeUrl);
        $this->assign('order_no',$order_no);
        return $this->themeFetch('wxpay');
    }
    
    /**
    * 微信同步通知
    * @author tangtanglove
    */
    public function getOrderStatus() {

        $uid = session('index_user_auth.uid');
        if (empty($uid)) {
            $this->error('未登录!');
        }

        $order_no = input('get.order_no');
        $ordersInfo = Db::name('Orders')->where(['order_no'=>$order_no,'uid'=>$uid])->find();

        if(empty($ordersInfo)){
            $this->error('参数错误');
        }

        $this->success($ordersInfo['status']);
    }

    /**
    * 微信同步通知
    * @author tangtanglove
    */
    public function return_url() {

        $uid = session('index_user_auth.uid');
        if (empty($uid)) {
            $this->error('未登录!');
        }

        $order_no = input('get.order_no');
        $ordersInfo = Db::name('Orders')->where(['order_no'=>$order_no,'uid'=>$uid])->find();

        if(empty($ordersInfo)){
            $this->error('参数错误');
        }

        $content = "您已成功支付".$ordersInfo['amount']."元,订单号:".$order_no;
        $this->assign('content',$content);
        $this->assign('ordersInfo',$ordersInfo);
        return $this->themeFetch('return_url');
    }

    /**
    * 微信异步通知
    * @author tangtanglove
    */
    public function notify_url()
    {
        // 获取返回的post数据包
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"] ;
        $out_trade_no = "";
        if (!empty($postStr)){
            libxml_disable_entity_loader(true);
            $postObj = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $out_trade_no = $postObj['out_trade_no'];
            // 订单状态处理
            Db::startTrans();

            // 修改订单 状态
            $ordersData['status'] = 'paid';
            $ordersData['is_pay'] = 1;
            $ordersResult = Db::name('Orders')->where(array('order_no'=>$out_trade_no))->update($ordersData);
            $ordersInfo = Db::name('Orders')->where(['order_no'=>$out_trade_no])->find();
            $data['order_id']         = $ordersInfo['id'];
            $data['status']           = 'paid';
            $data['createtime']     = time();
            $data['trade_no']         = $postObj['transaction_id'];
            $data['trade_status']     = 'SUCCESS';
            $ordersStatusResult = Db::name('OrdersStatus')->insert($data);

            //用户购买获得积分
            $score_info = Db::name('OrdersGoods')
            ->alias('a')
            ->join('goods b','b.id= a.goods_id','LEFT')
            ->where(['a.order_id'=>$ordersInfo['id']])
            ->field('a.num,b.score')
            ->find();

            $add_score = $score_info['score']*$score_info['num'];
            if($add_score){
                DB::name('Users')->where(['id'=>$ordersInfo['uid']])->update(['score' => ['exp','score+'.$add_score]]);
            }

            if($ordersResult && $ordersStatusResult){
                // 更改购物车状态
                $goodsList = Db::name('OrdersGoods')->where('order_id',$ordersInfo['id'])->select();
                foreach ($goodsList as $key => $value) {
                    Db::name('Cart')->where('goods_id',$value['goods_id'])->where(['status'=>1])->update(['status'=>2]);
                }
                Db::commit();
                $result = "<xml>
                <return_code><![CDATA[SUCCESS]]></return_code>
                <return_msg><![CDATA[OK]]></return_msg>
                </xml>";
            }else{
                Db::rollback();
                $result = "<xml>
                <return_code><![CDATA[FAIL]]></return_code>
                <return_msg><![CDATA[未接收到post数据]]></return_msg>
                </xml>";
            }
                
        }else {    
            $result = "<xml>
            <return_code><![CDATA[FAIL]]></return_code>
            <return_msg><![CDATA[未接收到post数据]]></return_msg>
            </xml>";
        }
        echo $result;    
    }
}
微信支付到这里就结束了,这是指云商城模块的一小部分,我们的目的是方便大家进行敏捷开发,避免重复造轮子
cms云商城,集成微信、阿里支付模块,阿里大于手机验证模块,邮箱验证模块等,极大的提高了开发速度,现在开源推广,如遇到什么问题,有什么好的建议,欢迎加q讨论
源码索取QQ群号 :588401996 或登录小微云商官网:http://w.yunshang.shop
最佳答案
评论( 相关
后面还有条评论,点击查看>>