您现在的位置是: 首页 >  技术分享 > 

Paypal对接文档
传说中的小明 2023-08-19 18:29:03

Paypal对接文档

1、申请paypal开发者账号,流程省略。

2、用上述申请的账号、密码,登录paypal 开放平台,地址如下:https://developer.paypal.com/

登录成功之后默认就是沙箱环境,如下图:

 图片1.png

点击 Apps & Credentials”按钮,如下图就可以看到 沙箱环境的 clientIDSecret;复制之后,放到后台的插件中即可。如果没有看到这个,可以自行点击“Create App”按钮,创建一个沙箱环境的APP,然后就能看到沙箱环境的 clientIDSecret

图片2.png 

3、点击创建的沙箱环境的APP名称,进入到详情,查看沙箱测试账号以及密码(备注:测试账号和密码 一个是卖家,一个是买家,测试支付的时候用买家账号),如下图:

     图片3.png

4、点击下图中的按钮,切换为正式环境,并创建正式的APP,查看相应的clientIDSecret,如下图:

 图片4.png图片5.png 

5、支付币种 可以填写,USD

6、获取支付链接接口,如下(仅供参考):

/**

     * @title 获取订单预支付信息

     *

     * @url /pay/order_pay

     * @method POST

     *

     * @param string order_sn 订单号

     * @param string pay_type 支付类型(alipay=支付宝支付,wxpay=微信支付,coin=余额支付,ios=苹果支付,paypal=PayPal支付)

     * @param string pay_password 支付密码(备注:pay_type=coin必填)

     * @param string out_trade_no 支付交易号(备注:pay_type=ios必填)

     *

     */

    public function order_pay($param = [], $user = [])

    {

        $user_id = $user['id'];

        $userinfo = \app\automatic\model\m3180\User::get($user_id);

        if(!$userinfo){

            $this->result('',0,'用户不存在','json');

        }

        $order_sn = $param['order_sn'];

        $order_type = substr($order_sn,0,2);

        $pay_type = $param['pay_type'] ?: 'paypal';

        $pay_password = $param['pay_password'] ?: '';

        $out_trade_no = $param['out_trade_no'] ?: '';

 

        if (!$order_sn) {

            return ApiReturn::r(0,'','订单号参数错误');

        }

        if (!in_array($order_type, ['UR'])) {

            return ApiReturn::r(0,'','订单类型错误');

        }

        if (!in_array($pay_type, ['alipay','wxpay','coin','ios','paypal'])) {

            return ApiReturn::r(0,'','请选择正确支付类型');

        }

        if ($pay_type == 'coin') {

            if (!$pay_password) {

                return ApiReturn::r(0,'','请输入支付密码');

            }

        }

 

        $money = 0.00;

        switch ($order_type) {

            case 'UR':

                $subject = '充值金币';

                // 充值

                $is_order = Db::name('user_recharge')->where(['order_sn' => $order_sn, 'user_id' => $user_id])->find();

                if (!$is_order || $is_order['pay_time'] > 0) {

                    return ApiReturn::r(0,'','该订单已经支付过,请勿重复支付');

                }

                $money = $is_order['money'];

                break;

        }

 

        switch ($pay_type) {

            case 'alipay':

                $data = array(

                    'subject' => $subject,

                    'body' => $subject,

                    'out_trade_no' => $order_sn,

                    'total_amount' => $money,

                    'notify_url' => member_config_com('web_site_domain') . '/index/pay/ali_notify'

                );

                $arr = addons_action('Alipay', 'Aop', 'AlipayTradeAppPayRequest', [$data]);

                return ApiReturn::r(1,$arr,'获取预支付信息成功');

                break;

            case 'wxpay':

                $data_pay = array(

                    'body' => $subject,

                    'total_fee' => $money,

                    'out_trade_no' => $order_sn,

                    'notify_url' => member_config_com('web_site_domain') . '/index/pay/wx_notify'

                );

                $arr = addons_action('WeChat', 'AppPay', 'pay', [$data_pay]);

                return ApiReturn::r(1,$arr,'获取预支付信息成功');

                break;

            case 'paypal':

                $data_pay = array(

                    'product' => $subject,

                    'price' => $money,

                    'shipping' => 0,

                    'order_sn' => $order_sn,

                    'description' => $subject,

                    'notify_url' => member_config_com('web_site_domain') . '/index/pay/paypal_notify'

                );

                 $arr = addons_action('Paypal', 'Paypal', 'pay', $data_pay);

                $config = addons_config('Paypal');

                // 获取到路径之后 获取路劲中的 token 保存到数据库

                $dsn = @parse_url($arr);

                parse_str($dsn['query'],$query_param);

                if (isset($query_param['token']) && $query_param['token']) {

                    Db::name('user_recharge')

                        ->where(['order_sn' => $order_sn, 'user_id' => $user_id])

                        ->update(['token' => $query_param['token'], 'update_time' => time()]);

                }

 

                return ApiReturn::r(1,[

                    'url' => $arr,

                    'clientId' => $config['environment'] ? $config['clientId'] : $config['clientIdTest'],

                    'orderId' => $order_sn,

                    'currency' => $config['country'],

                    'environment' => $config['environment'] ? 'live' : 'sandbox',

                ],'获取预支付信息成功');

                break;

            case 'coin':

                if (!in_array($order_type,['UV'])) {

                    return ApiReturn::r(0,'','支付订单类型错误');

                    break;

                }

                // 判断支付密码是否正确

                if (!Hash::check((string)$pay_password, $userinfo->pay_password)) {

                    return ApiReturn::r(0, '', '支付密码错误');

                    break;

                }

                // 判断余额是否充足

                if($userinfo->user_money < $money){

                    return ApiReturn::r(-1, '', '可用余额不足');

                    break;

                }

 

                Db::startTrans();

                try{

                    // 修改订单信息

                    if ($order_type == 'UV') {

                        \app\automatic\model\m3642\Uservip::orderNotify($order_sn, date('YmdHis').rand(100000,999999),$pay_type);

                    }

                    // 更改用户余额

                    $notes = '用户【'.$userinfo->user_nickname.'ID为:【'.$user_id.'】于'.date('Y-m-d H:i:s').'进行了余额支付,订单号为:'.$order_sn;

                    \app\automatic\model\m3642\User::changeUserMoney($user_id,0-$money,6,$notes,$order_sn,'');

 

                    Db::commit();

                } catch (\Exception $e) {

                    Db::rollback();

                    return ApiReturn::r(0, '', '支付失败');

                }

                return ApiReturn::r(1, '', '支付成功');

                break;

            case 'ios':

                if (!in_array($order_type,['UV'])) {

                    return ApiReturn::r(0,'','支付订单类型错误');

                    break;

                }

 

                Db::startTrans();

                try{

                    // 修改订单信息

                    if ($order_type == 'UV') {

                        \app\automatic\model\m3642\Uservip::orderNotify($order_sn, $out_trade_no ?: date('YmdHis').rand(100000,999999),$pay_type);

                    }

 

                    Db::commit();

                } catch (\Exception $e) {

                    Db::rollback();

                    return ApiReturn::r(0, '', '支付失败');

                }

                return ApiReturn::r(1, '', '支付成功');

                break;

        }

    }


Copyright © 2021
www.yunyakeji.cn All rights reserved. 小明博客 豫ICP备2020029140号-1