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中,如何把引入文件,修改成命名空间的格式

在这里插入图片描述

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

【微信支付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
<?php
/**
 * Created by PhpStorm.
 * User: 14155
 * Date: 2019/4/14
 * Time: 21:22
 */

namespace app\userapi\service;


use app\common\model\OrderModel;
use app\common\model\UserModel;
use app\exception\ParameException;
use app\lib\enum\OrderStatusEnum;
use think\facade\Config;
use think\facade\Log;

//	引入WxPay.Api.php【官方文件】
include '/www/wwwroot/api_myphp_vip/GitThub_ThinkPHP5/ThinkPhp5/extend/WxPay/WxPay.Api.php';

//require '../../../extend/WxPay/WxPay.Api.php';

class PayService
{
    private $orderID;
    private $orderNO;
    private $userID;

    function __construct($userID, $orderID)
    {
        if (!$orderID) {
            throw new ParameException('订单id不能为空');
        }
        if (!$userID) {
            throw new ParameException('当前用户不存在');
        }
        $this->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
<?php
/**
 * Created by PhpStorm.
 * User: 14155
 * Date: 2019/5/1
 * Time: 20:33
 */

namespace app\lib\enum;


class OrderStatusEnum
{
    // 待支付
    const UNPAID = 1;

    // 已支付
    const PAID = 2;

    // 已发货
    const DELIVERED = 3;

    // 已支付,但库存不足
    const PAID_BUT_OUT_OF = 4;

    // 已处理PAID_BUT_OUT_OF
    const HANDLED_OUT_OF = 5;
}
  1. 文件extend/WxPay/已放置自己的百度网盘,需要私聊

5微信小程序-微信回调

public function notify(Request $request)
    {
        echo 1001;
        Log::record('进入回调','demo');
        echo 2002;
		//业务处理,修改状态
        Log::record('[小程序支付回调结束]', 'demo');
        echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
    }
随便找个点击事件就行
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)
           }
        })
      });
      
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值