Wxpay.php 3.9 KB
<?php

namespace app\api\controller;

use app\common\controller\Api;
use addons\epay\library\Service;
use app\admin\model\Porder;
use think\Db;
use Yansongda\Pay\Pay;
use think\Log;
use fast\Http;
use think\Validate;
use Exception;
/**
 * 支付接口**
 */
class Wxpay extends Api
{
    protected  $noNeedLogin = [];
    protected $noNeedRight = '*';
    protected $user_id = '';//token存贮user_id
    protected $order_status = [];//订单状态
    public function _initialize()
    {
        parent::_initialize();
        $this->user_id = $this->auth->getUserId();
        $this->order_status = config('site.order_status');
    }

    /**
     * @ApiTitle    (支付订单)
     * @ApiSummary  (支付订单)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/wxpay/pay)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     * @ApiParams   (name="openid", type="string", required=true, description="小程序openid")
     * @ApiParams   (name="pay_order_sn", type="string", required=true, description="支付订单号")
     * @ApiReturn
     */
    public function pay(){
        if($this->request->isPost()){
            //创建支付对象
            $pay = Pay::wechat(Service::getConfig('wechat'));
            $openid = $this->request->post('openid');//小程序传递openid
            $pay_order_sn = $this->request->post('pay_order_sn');//支付订单号

            if(empty($openid) && empty($pay_order_sn)){
                $this->error('无效的参数');
            }
            //查询订单是否已支付
            $is_pay = Db::table('gc_porder')
                ->where(['pay_order_sn' => $pay_order_sn, 'uid' => $this->user_id])
                ->where('status','>',0)
                ->select();
            if ($is_pay) {
                $this->error('该订单已支付过了');
            }
            //是否有此订单
            $exist = Db::table('gc_porder')
                ->where(['pay_order_sn' => $pay_order_sn, 'uid' => $this->user_id, 'status' => $this->order_status[0]])
                ->select();
            if (!$exist) {
                $this->error('无效的订单');
            }
            //计算总价格
            $total_price = 0;
            foreach ($exist as $value) {
                $total_price += $value['total_price'];
            }
            //构建订单信息
            $order = [
                'out_trade_no' => $pay_order_sn,//支付订单号
                'body' => '广西小纸皮再生资源回收有限公司',
                'total_fee' => 1,
                //'total_fee' => floatval($total_price)*100,//单位:分
                'openid' => $openid,
                'notify_url'   => $this->request->root(true) . '/api/Wxpay/notify',
                'return_url'   => $this->request->root(true) . '/api/Wxpay/wechatReturn',
            ];
            //跳转或输出
            $this->success('成功',$pay->miniapp($order));

        }else{
            $this->error('请求方式错误');
        }
    }

    /**
     * 支付成功回调
     */
    public function notify(){
        $pay = Service::checkNotify('wechat');
        return $pay;
        if (!$pay) {
            $this->error('签名错误');
        }
        //你可以在这里你的业务处理逻辑,比如处理你的订单状态、给会员加余额等等功能
        $data = $pay->verify();
        $porderModel = new Porder();
        $porderModel->where(['uid' => 26,'p_id'=>6])->update(['status'=>1]);

        //下面这句必须要执行,且在此之前不能有任何输出
        echo $pay->success();
        return;
    }

    /**
     * 微信异步通知
     */
    public function wechatReturn(){
        $pay = Service::checkReturn('wechat');
        if (!$pay) {
            $this->error('签名错误');
        }
        //你可以在这里定义你的提示信息,但切记不可在此编写逻辑
        $this->success("恭喜你!支付成功!");
        return;
    }

}