Ver Fonte

商城改用epay支付,异步回调

lizhen_gitee há 3 meses atrás
pai
commit
e4ef6afa14

+ 4 - 3
addons/shopro/controller/Pay.php

@@ -20,7 +20,7 @@ class Pay extends Common
 
     protected $noNeedLogin = ['alipay', 'notify', 'notifyRefund'];
     protected $noNeedRight = ['*'];
-
+    //支付订单
     public function prepay()
     {
         $this->repeatFilter();          // 防止连点
@@ -162,7 +162,7 @@ class Pay extends Common
             'amount'       => $payModel->pay_fee,
             'method'       => strtolower($platform),
 //            'openid'       => $openid,
-            'notifyurl' => config('pay_notify_url').'/api/notify/recharge_notify_base/paytype/'.$payment,
+            'notifyurl' => config('pay_notify_url').'/api/notify/shopro_notify_base/paytype/'.$payment,
             'returnurl' => '',
         ];
         if ($payment == 'wechat') {
@@ -170,6 +170,7 @@ class Pay extends Common
                 $params['openid'] = $user->wechat_openid;
             }
         }
+
         $res = Service::submitOrder($params);
 
         if($payment == 'wechat'){
@@ -208,7 +209,7 @@ class Pay extends Common
 
 
     /**
-     * 支付宝网页支付
+     * 支付宝网页支付,一般用不到
      */
     public function alipay()
     {

+ 1 - 0
addons/shopro/library/pay/provider/Alipay.php

@@ -61,6 +61,7 @@ class Alipay extends Base
         $this->init('alipay', $config);
         try {
             $data = Pay::alipay()->callback(); // 是的,验签就这么简单!
+//            $data = Pay::alipay()->verify(); // 是的,验签就这么简单!
 
             // {    // 支付宝支付成功回调参数
             //     "gmt_create": "2022-06-21 14:54:39",

+ 79 - 0
application/api/controller/Notify.php

@@ -10,6 +10,9 @@ use think\Db;
 use addons\epay\library\Service;
 use think\Request;
 
+use app\admin\model\shopro\Pay as PayModel;
+use addons\shopro\service\pay\PayOper;
+
 /**
  * 订单支付回调
  */
@@ -162,6 +165,82 @@ class Notify extends Api
         return true;
     }
 
+    //充值VIP 异步回调对外方法
+    public function shopro_notify_base()
+    {
+
+        //验签
+        $paytype     = input('paytype', 'wechat');
+        $notify_file = $this->notify_log_start($paytype);
+        $pay         = Service::checkNotify($paytype);
+        if (!$pay) {
+            echo '签名错误';
+            exit;
+        }
+
+        //验证,拿订单号等信息
+        $data         = $pay->verify();
+        $out_trade_no = $data['out_trade_no'];
+        //订单查询
+        $info = Db::name('shopro_pay')->where('pay_sn', $out_trade_no)->find();
+
+        if (empty($info)) {
+            echo $pay->success();
+            exit;
+        }
+
+        if ($info['status'] != 'unpaid') {
+            echo $pay->success();
+            exit;
+        }
+        //你可以在此编写订单逻辑
+        $rs = $this->shopro_notify_do($out_trade_no,$data,$paytype);
+        if ($rs === false) {
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        } else {
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        }
+
+        //默认
+        echo $pay->success();
+        exit;
+    }
+
+    //充值金币 逻辑
+    private function shopro_notify_do($out_trade_no,$data,$payment)
+    {
+
+        // 查询 pay 交易记录
+        $payModel = PayModel::where('pay_sn', $out_trade_no)->find();
+        if (!$payModel || $payModel->status != PayModel::PAY_STATUS_UNPAID) {
+            // 订单不存在,或者订单已支付
+            return false;
+        }
+
+        $originData = [];
+        Db::transaction(function () use ($payModel, $data, $originData, $payment) {
+            $notify = [
+                'pay_sn' => $data['out_trade_no'],
+                'transaction_id' => $data['transaction_id'],
+                'notify_time' => $data['notify_time'],
+                'buyer_info' => $data['buyer_info'],
+                'payment_json' => $originData ? json_encode($originData) : json_encode($data),
+                'pay_fee' => $data['pay_fee'],          // 微信的已经*100处理过了
+                'pay_type' => $payment              // 支付方式
+            ];
+
+            // pay 实例
+            $payOper = new PayOper($payModel->user_id);
+            $payOper->notify($payModel, $notify);
+        });
+
+        return true;
+    }
+
     //异步日志
     private function notify_log_start($paytype = 'wechat')
     {