1、申请paypal开发者账号,流程省略。
2、用上述申请的账号、密码,登录paypal 开放平台,地址如下:https://developer.paypal.com/
登录成功之后默认就是沙箱环境,如下图:
点击 “Apps & Credentials”按钮,如下图就可以看到 沙箱环境的 clientID,Secret;复制之后,放到后台的插件中即可。如果没有看到这个,可以自行点击“Create App”按钮,创建一个沙箱环境的APP,然后就能看到沙箱环境的 clientID,Secret;
3、点击创建的沙箱环境的APP名称,进入到详情,查看沙箱测试账号以及密码(备注:测试账号和密码 一个是卖家,一个是买家,测试支付的时候用买家账号),如下图:
4、点击下图中的按钮,切换为正式环境,并创建正式的APP,查看相应的clientID,Secret,如下图:
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;
}
}
下一篇: 直播以及腾讯IM申请流程
Copyright © 2021
www.yunyakeji.cn All rights reserved. 小明博客 豫ICP备2020029140号-1