tp5 微信支付开发流程

tp5 微信支付开发流程
1.用户在选择商品后,向APi提交包含它所选择商品的相关信息。
2.APi在接收到信息后,需要检查订单相关商品的库存量。
3.有库存,把订单数据存入数据库中=  下单成功了,返回客户端消息,告诉客户端可以支付了
4.调用自己的支付接口,进行支付。
5.还需要再次进行库存量检测
6.服务器这边就可以调用微信的支付接口进行支付
7.微信会返回给我们一个支付结果(异步)
8.成功:也需要进行库存量的检验。
9.成功:进行库存量的扣除。

https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1
sdk下载
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

tp5 微信支付开发流程_第1张图片

【扩展】
如何在tp5中,如何把引入文件,修改成命名空间的格式

tp5 微信支付开发流程_第2张图片

========================================

【微信支付api】

========================================
1.【已生成未支付订单】,根据订单号进行支付操作

public function getPreOrder(Request $request)
    {
        $user_id = $request->user->id;
        $order_id = $request->param('order_id');

        $pay = new PayService($user_id,$order_id);

        return $pay->pay();

    }
  1. 支付服务文件PayService
orderID = $orderID;
        $this->userID = $userID;
    }

    /**
     * 支付操作
     * @return null
     * @throws ParameException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function pay()
    {
        //  效验订单状态
        $this->checkOrderValidate();

        $order = new OrderModel();
        $status = $order->checkOrderStock($this->orderID);
        if (!$status['pass'])
        {
            return $status;
        }

        //  支付
        return $this->makeWxPreOrder($status['orderPrice']);
    }
    protected function makeWxPreOrder($totalPrice)
    {
        $totalPrice = 0.01;
        $openid = UserModel::get($this->userID)->openid;

        $wxOrderData = new \WxPayUnifiedOrder();
        $wxOrderData->SetOut_trade_no($this->orderNO);
        $wxOrderData->SetTrade_type('JSAPI');
        //  订单总金额(分单位)
        $wxOrderData->SetTotal_fee($totalPrice * 100);
        $wxOrderData->SetBody('柠檬初上');
        $wxOrderData->SetOpenid($openid);
        //  需要传递回调url
        $wxOrderData->SetNotify_url('https://myphp.vip/userapi/v1/pay/notify');

        return $this->getPaySignTure($wxOrderData);
    }

    /**
     * @param $wxOrderData
     * @return null
     * @throws \WxPayException
     */
    private function getPaySignTure($wxOrderData)
    {
        //  调用微信下单的统一接口
        $wxPay = \WxPayApi::unifiedOrder($wxOrderData);

        if ($wxPay['return_code'] != 'SUCCESS' || $wxPay['result_code'] != 'SUCCESS') {
            Log::record($wxPay,'error');
            Log::record('微信支付订单失败','error');
        }
        //  prepay_id   向用户推送消息
        //        $this->recordOrder($wxPay);
        $signature = $this->sign($wxPay);
        return $signature;
    }

    /**
     * 生成一组参数-签名
     * @param $wxOrder
     * @return array
     * @throws \WxPayException
     */
    private function sign($wxOrder)
    {
        $jsApiPayData = new \WxPayJsApiPay();
        $jsApiPayData->SetAppid(Config::get('wx.app_id'));
        $jsApiPayData->SetTimeStamp((string)time());

        $rand = md5(time() . mt_rand(0,1000));
        $jsApiPayData->SetNonceStr($rand);
        $jsApiPayData->SetPackage('prepay_id='.$wxOrder['prepay_id']);
        $jsApiPayData->SetSignType('md5');

        $sign = $jsApiPayData->MakeSign();

        $rawValues = $jsApiPayData->GetValues();
        $rawValues['paySign'] = $sign;
        unset($rawValues['appId']);

        return $rawValues;
    }
    private function recordOrder($wxOrder)
    {
        OrderModel::where('id','=',$wxOrder->id)
            ->update(['prepay_id' => $wxOrder->prepay_uid]);
    }

    /**
     * 验证当前订单
     * 1.检查当前订单是否属于user_id
     * 2.检查订单状态
     * //  1:未支付, 2:已支付,3:已发货 , 4: 已支付,但库存不足 status
     * @throws ParameException
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    private function checkOrderValidate()
    {
        $orderFind = OrderModel::where('id','=',$this->orderID)
            ->where('user_id','=',$this->userID)
            ->find();
        if (!$orderFind) {
            throw new ParameException('当前订单不存在,请刷新重试'.$this->orderID.'==='.$this->userID);
        }

        if ($orderFind->status != OrderStatusEnum::UNPAID) {
            throw new ParameException('当前订单非未支付状态');
        }

        $this->orderNO = $orderFind->order_no;

        return true;
    }
}
  1. 配置:自定义常量名 OrderStatusEnum
  1. 文件extend/WxPay/已放置自己的百度网盘,需要私聊

5微信小程序-微信回调

public function notify(Request $request)
    {
        echo 1001;
        Log::record('进入回调','demo');
        echo 2002;
		//业务处理,修改状态
        Log::record('[小程序支付回调结束]', 'demo');
        echo "";
    }
随便找个点击事件就行
wechat_pay(){
      console.log('进入微信支付');
      home.weChatPay((res)=>{
        wx.requestPayment({
          timeStamp: res.timeStamp,
          nonceStr: res.nonceStr,
          package: res.package,
          signType: res.signType,
          paySign: res.paySign,
          success(res) {
            console.log(res)
          },
          fail(res) {
            console.log(res)
           }
        })
      });
      
    }

你可能感兴趣的:(php)