您现在的位置是:首页> 编程文章 个人博客模板

使用 yansongda/pay 进行支付宝和微信 App 支付

无痕小Q个人博客 2020-03-06 00:10:48主页 884人已围观

简介现在很多项目 (APP) 都会用到微信或支付宝支付,然而官方文档和乱七八糟的签名会让很多开发者一脸懵逼,所以 github 有很多第三方的包,已经封装好了各种支付,这里以 yansongda/pay 这个包为例。


安装


composer require yansongda/pay -vvv

配置文件 (config/pay.php 这个配置文件自行创建,不用非得跟我一样), 然后在.env 文件中填写对应配置。


<?php

return [

 'alipay' => [

     // 支付宝分配的 APPID

     'app_id' => env('ALI_APP_ID', ''),


     // 支付宝异步通知地址

     'notify_url' => '',


     // 支付成功后同步通知地址

     'return_url' => '',


     // 阿里公共密钥,验证签名时使用

     'ali_public_key' => env('ALI_PUBLIC_KEY', ''),


     // 自己的私钥,签名时使用

     'private_key' => env('ALI_PRIVATE_KEY', ''),


     // optional,默认 warning;日志路径为:sys_get_temp_dir().'/logs/yansongda.pay.log'

     'log' => [

         'file' => storage_path('logs/alipay.log'),

     //  'level' => 'debug'

     //  'type' => 'single', // optional, 可选 daily.

     //  'max_file' => 30,

     ],


     // optional,设置此参数,将进入沙箱模式

     // 'mode' => 'dev',

 ],


 'wechat' => [

     // 公众号 APPID

     'app_id' => env('WECHAT_APP_ID', ''),


     // 小程序 APPID

     'miniapp_id' => env('WECHAT_MINIAPP_ID', ''),


     // APP 引用的 appid

     'appid' => env('WECHAT_APPID', ''),


     // 微信支付分配的微信商户号

     'mch_id' => env('WECHAT_MCH_ID', ''),


     // 微信支付异步通知地址

     'notify_url' => '',


     // 微信支付签名秘钥

     'key' => env('WECHAT_KEY', ''),


     // 客户端证书路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。

     'cert_client' => base_path('storage/app/cert/apiclient_cert.pem'),


     // 客户端秘钥路径,退款、红包等需要用到。请填写绝对路径,linux 请确保权限问题。pem 格式。

     'cert_key' =>  base_path('storage/app/cert/apiclient_key.pem'),


     // optional,默认 warning;日志路径为:sys_get_temp_dir().'/logs/yansongda.pay.log'

     'log' => [

         'file' => storage_path('logs/wechat.log'),

     //  'level' => 'debug'

     //  'type' => 'single', // optional, 可选 daily.

     //  'max_file' => 30,

     ],


     // optional

     // 'dev' 时为沙箱模式

     // 'hk' 时为东南亚节点

     // 'mode' => 'dev',

 ],

];

下单获取客户端用以吊起支付的参数


微信

/**

 * @Author woann <www.woann.cn>

 * @param Request $request

 * @return \Illuminate\Http\JsonResponse

 * @throws \Illuminate\Validation\ValidationException

 * @des 微信下单获取支付参数

 */

public function wechatPay(Request $request)

{

    $this->validate(

        $request,

        [

            'order_id'           =>  'required|digits_between:1,9|integer',

        ]

    );

    $order_id = $request->get('order_id');

    $order = LevelOrder::find($order_id);

    if (!$order || $order->state != 0) {

        return returnApi(500,'订单状态异常');

    }

    //以上为获取订单信息 根据自己业务调整

    $data = [

        'out_trade_no' => $order->order_no,//订单号

        'body'          => $order->goods_name,//商品名称

        'total_fee'      => $order->total * 100//金额单位分

    ];

    $config = config('pay.wechat');获取配置参数

    $config['notify_url'] = env('APP_URL').'/notify';//加入回调url

    $result = Pay::wechat($config)->app($data);//统一下单

    $json = $result->getContent();

    $res = json_decode($json);

    return returnApi(200,'SUCCESS', $res);//返回支付参数

    /* 返回数据示例

    {

        "code":200,

        "msg":"SUCCESS",

        "data":{

            "appid":"wx1076a204916e103b",

            "partnerid":"1571249771",

            "prepayid":"wx09151331559233021135325f1455481800",

            "timestamp":"1578554011",

            "noncestr":"pfCEOneTh3Ic2RdC",

            "package":"Sign=WXPay",

            "sign":"DCE5402CEA09721C7225F2F5DC563EE3"

        }

    }

    */

}

支付宝

/**

     * @Author woann <www.woann.cn>

     * @param Request $request

     * @return \Illuminate\Http\JsonResponse

     * @throws \Illuminate\Validation\ValidationException

     * @des 支付宝支付

     */

    public function aliPay(Request $request)

    {

        $this->validate(

            $request,

            [

                'order_id'           =>  'required|digits_between:1,9|integer',

            ]

        );

        $order_id = $request->get('order_id');

        $order = Order::find($order_id);

        if (!$order || $order->state != 0) {

            return returnApi(500,'订单状态异常');

        }

        //以上为获取订单信息 根据自己业务调整

        $order = [

            'out_trade_no' => $order->order_no,//订单号

            'total_amount' => $order->total,//金额 单位元

            'subject'      => $order->name,//商品名称

        ];

        $config = config('pay.alipay');

        $config['notify_url'] = env('APP_URL').'/v1/notify';//加入回调url

        $alipay = Pay::alipay($config);

        $res = $alipay->app($order)->getContent();

        return returnApi(200,'SUCCESS',['orderInfo' => $res]);

            /* 返回数据示例

            {

                "code":200,

                "msg":"SUCCESS",

                "data":{

                    "orderInfo":"app_id=2021001100636235&format=JSON&charset=utf-8&sign_type=RSA2&version=1.0&notify_url=https%3A%2F%2Fqiangyibo.enumen.com%2Fv1%2Flevel%2Falipay%2Fnotify&timestamp=2020-02-13+10%3A44%3A50&biz_content=%7B%22out_trade_no%22%3A%222020010914545331453%22%2C%22total_amount%22%3A%2259.70%22%2C%22subject%22%3Anull%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D&method=alipay.trade.app.pay&sign=cX6uehDLpo8Lw8eat5X0XaoH09hbkZnb%2BNs4hfOokSXd2rhQBUuC45x6b%2FtfjDlNuFgukpPGzF1SlqP%2FFadiOBMYfir%2FZv3D3fEq8ec%2BHhsVk7lrUytyGhLyYgAEVjEA1uJyQAUKfTqDs9FeWgnpi3IiHk8hO4J8zwPjV2YG0RvZnJrEXTgavz6E2gMNkU%2BtaqhICCtVxyq1nbc%2BnYM4k8jT57dEEKC1fn7x1LTU60YPBxun7oKMsn%2BZNYPBycq4KGh9QKh9N7mRreFqT38PwiWFx4zOCwwMUM%2B%2BxxiqaJEg%2BcquTYptF1oxujwHvFB9O25dkxUeUvFUKhFD5MevZQ%3D%3D"

                }

            }

        */

    }

}

回调

微信

public function wechatNotify(Request $request)

  {

      $config = config('pay.wechat');

      $pay = Pay::wechat($config);//实例化支付对象

      try{

          $data = $pay->verify(); // 是的,验签就这么简单!

          //以下根据自己业务进行支付校验

          $order = Order::where('order_no', $data->out_trade_no)->first();

          if (!$order || $order->state != 0)  {

              //如果订单状态异常直接退出

              return $pay->success();

          }

          if (($order->total) != $data->total_fee / 100) {

              //如果金额不匹配直接退出

              return $pay->success();

          }

          //进行订单状态变更等支付成功操作

          //....

          return $pay->success();

      } catch (\Exception $e) {

      }

  }

支付宝

public function aliPayNotify(Request $request)

  {

      $config = config('pay.alipay');

      $alipay = Pay::alipay($config);

      try{

          $data = $alipay->verify(); // 是的,验签就这么简单!

          //以下根据自己业务进行支付校验

          $order = Order::where('order_no', $data->out_trade_no)->first();

          if (!$order || $order->state != 0)  {

              //如果订单状态异常直接退出

              return $alipay->success();

          }

          if (($order->total) != $data->total_amount) {

              return $alipay->success();

          }

          //进行订单状态变更等支付成功操作

          //....

          return $alipay->success();

          Log::debug('Alipay notify', $data->all());

      } catch (\Exception $e) {

//             $e->getMessage();

      }

      return $alipay->success();// laravel 框架中请直接 `return $alipay->success()`

  }

阅读量! (884)

关于本站

昵称:无痕小Q

职业:php-go-web开发工程师

现居:北京

Email:1838638884@qq.com

    苏轼 明月未出群山高,瑞光千丈生白毫。  一杯未尽银阙涌,乱云脱坏如崩涛。  谁为天公洗眸子,应费明河千斛水。  遂令冷看世间人,照我湛然心不起。  西南火星如弹丸,角尾奕奕苍龙蟠。  今宵注眼看不见

网站公告

  • 欢迎来到我的博客

  • 1:欢迎来到我的博客


    2:博客免费api接口现已上线


    3:博客会定期更新文章


    4:欢迎大家来捧场


    其一 天街小雨润如酥,草色遥看近却无。 最是一年春好处,绝胜烟柳满皇都。 其二 莫道官忙身老大,即无年少逐春心。 凭君先到江头看,柳色如今深未深。

站点信息

山川异域,风月同天。  寄诸佛子,共结来缘。 生活是一位睿智的长者,生活是一位博学的老师,它常常春风化雨,润物无声地为我们指点迷津,给我们人生的启迪。
  • 建站时间:2019-8-30
  • 网站程序:php,laravel-swoole框架
  • 今日流量:71(10分钟统计一次)
  • 本月流量:9412
  • 浏览总量:388339
  • 统计方式:中间件,redis消息队列,定时任务
    君不见黄河之水天上来,奔流到海不复回。 君不见高堂明镜悲白发,朝如青丝暮成雪。 人生得意须尽欢,莫使金樽空对月。 天生我材必有用,千金散尽还复来。 烹羊宰牛且为乐,会须一饮三百杯。