123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- <?php
- /**
- * Created by PhpStorm.
- * User: Gold
- * Date: 2024/1/24
- * Time: 14:32
- */
- namespace app\api\controller;
- use app\admin\model\order\Order;
- use app\admin\model\order\OrderGoods;
- use app\admin\model\order\UserGoods;
- use app\common\controller\Api;
- use EasyWeChat\Factory;
- use think\Db;
- use Yansongda\Pay\Pay as YansongdaPay;
- use Yansongda\Pay\Log;
- class Pay extends Api
- {
- /**
- * 微信支付
- *
- */
- public function wxpay($arr = ''){
- $app_id = Db::name('config')->where('name','app_id')->value('value');
- $mch_id = Db::name('config')->where('name','mch_id')->value('value');
- $key = Db::name('config')->where('name','key')->value('value');
- $config = [
- // 必要配置
- 'app_id' => $app_id,
- 'mch_id' => $mch_id,
- 'key' => $key, // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
- // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
- 'cert_path' => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
- 'key_path' => 'path/to/your/key', // XXX: 绝对路径!!!!
- 'notify_url' => '默认的订单回调地址', // 你也可以在下单时单独设置来想覆盖它
- ];
- $app = Factory::payment($config);
- $result = $app->order->unify([
- 'body' => '购买教材',
- 'out_trade_no' => $arr['out_trade_no'],
- 'total_fee' => $arr['total_fee'],
- 'notify_url' => 'https://'.$_SERVER['HTTP_HOST'].'/api/pay/wxnotify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
- 'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
- 'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
- ]);
- //如trade_type = APP
- //需要进行二次签名
- (new \EasyWeChat\Payment\Jssdk\Client($app))->appConfig($result['prepay_id']);
- return $result;
- }
- /**
- * 微信回调
- *
- */
- public function wxnotify(){
- $app_id = Db::name('config')->where('name','app_id')->value('value');
- $mch_id = Db::name('config')->where('name','mch_id')->value('value');
- $key = Db::name('config')->where('name','key')->value('value');
- $config = [
- // 必要配置
- 'app_id' => $app_id,
- 'mch_id' => $mch_id,
- 'key' => $key, // API v2 密钥 (注意: 是v2密钥 是v2密钥 是v2密钥)
- // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
- 'cert_path' => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
- 'key_path' => 'path/to/your/key', // XXX: 绝对路径!!!!
- 'notify_url' => '默认的订单回调地址', // 你也可以在下单时单独设置来想覆盖它
- ];
- $app = Factory::payment($config);
- $response = $app->handlePaidNotify(function($message, $fail){
- // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
- $OrderModel = new Order();
- $order = $OrderModel->where('order_on',$message['out_trade_no'])->find();
- if (!$order || $order->paid_at) { // 如果订单不存在 或者 订单已经支付过了
- return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
- }
- ///////////// <- 建议在这里调用微信的【订单查询】接口查一下该笔订单的情况,确认是已经支付 /////////////
- if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
- // 用户是否支付成功
- if ($message['result_code'] === 'SUCCESS') {
- $OrderGoods = new OrderGoods();
- $UserGoods = new UserGoods();
- $OrderModel = new Order();
- $order = $OrderModel->where('order_on',$message['out_trade_no'])->find();
- $o_arr = [
- 'status' => 1,
- 'paytime' => date('Y-m-d H:i:s')
- ];
- $OrderModel->where('id',$order['id'])->update($o_arr);
- $goods = $OrderGoods->where('order_id',$order['id'])->select();
- foreach ($goods as $k => $v){
- $g_arr = [
- 'goods_type' => $v['goods_type'],
- 'goods_id' => $v['goods_id'],
- 'order_id' => $order['id'],
- 'user_id' => $order['user_id'],
- ];
- $UserGoods->save($g_arr);
- }
- // 用户支付失败
- } else{
- $order->status = 'paid_fail';
- }
- } else {
- return $fail('通信失败,请稍后再通知我');
- }
- $order->save(); // 保存订单
- return true; // 返回处理完成
- });
- $response->send();
- }
- /**
- * 支付宝支付
- *
- */
- public function alipay($arr){
- $app_id = Db::name('config')->where('name','ali_app_id')->value('value');
- $ali_public_key = Db::name('config')->where('name','ali_public_key')->value('value');
- $private_key = Db::name('config')->where('name','private_key')->value('value');
- $config = [
- 'app_id' => $app_id,
- 'notify_url' => 'https://'.$_SERVER['HTTP_HOST'].'/api/pay/wxnotify',
- 'return_url' => 'http://yansongda.cn/return.php',
- 'ali_public_key' => $ali_public_key,
- 'private_key' => $private_key,
- 'log' => [ // optional
- 'file' => './logs/alipay.log',
- 'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
- 'type' => 'single', // optional, 可选 daily.
- 'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
- ],
- 'http' => [ // optional
- 'timeout' => 5.0,
- 'connect_timeout' => 5.0,
- // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
- ],
- // 'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
- ];
- $order = [
- 'out_trade_no' => $arr['out_trade_no'],
- 'total_amount' => $arr['total_amount'],
- 'subject' => '购买教材',
- ];
- $alipay = YansongdaPay::alipay($config);
- if($arr['type'] == 'H5'){
- $result = $alipay->wap($order);
- }else{
- $result = $alipay->scan($order);
- }
- return $result;
- }
- public function alinotify()
- {
- $app_id = Db::name('config')->where('name','ali_app_id')->value('value');
- $ali_public_key = Db::name('config')->where('name','ali_public_key')->value('value');
- $private_key = Db::name('config')->where('name','private_key')->value('value');
- $config = [
- 'app_id' => $app_id,
- 'notify_url' => 'http://yansongda.cn/notify.php',
- 'return_url' => 'http://yansongda.cn/return.php',
- 'ali_public_key' => $ali_public_key,
- 'private_key' => $private_key,
- 'log' => [ // optional
- 'file' => './logs/alipay.log',
- 'level' => 'info', // 建议生产环境等级调整为 info,开发环境为 debug
- 'type' => 'single', // optional, 可选 daily.
- 'max_file' => 30, // optional, 当 type 为 daily 时有效,默认 30 天
- ],
- 'http' => [ // optional
- 'timeout' => 5.0,
- 'connect_timeout' => 5.0,
- // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
- ],
- // 'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
- ];
- $alipay = Pay::alipay($config);
- try{
- $data = $alipay->verify(); // 是的,验签就这么简单!
- // 请自行对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。
- // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;
- // 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);
- // 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email);
- // 4、验证app_id是否为该商户本身。
- // 5、其它业务逻辑情况
- if($data->trade_status == 'TRADE_SUCCESS'){
- $OrderModel = new Order();
- $order = $OrderModel->where('order_on',$data->out_trade_no)->find();
- if (!$order) { // 如果订单不存在 或者 订单已经支付过了
- return $alipay->success()->send();
- }
- $OrderGoods = new OrderGoods();
- $UserGoods = new UserGoods();
- $OrderModel = new Order();
- $order = $OrderModel->where('order_on',$data->out_trade_no)->find();
- $o_arr = [
- 'status' => 1,
- 'paytime' => date('Y-m-d H:i:s')
- ];
- $OrderModel->where('id',$order['id'])->update($o_arr);
- $goods = $OrderGoods->where('order_id',$order['id'])->select();
- foreach ($goods as $k => $v){
- $g_arr = [
- 'goods_type' => $v['goods_type'],
- 'goods_id' => $v['goods_id'],
- 'order_id' => $order['id'],
- 'user_id' => $order['user_id'],
- ];
- $UserGoods->save($g_arr);
- }
- }
- Log::debug('Alipay notify', $data->all());
- } catch (\Exception $e) {
- // $e->getMessage();
- }
- return $alipay->success()->send();// laravel 框架中请直接 `return $alipay->success()`
- }
- }
|