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();
}
- 支付服务文件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;
}
}
- 配置:自定义常量名 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;
}
- 文件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)
}
})
});
}