孙军玲1
已更新 793篇
勤奋鸟旗下 软件定制开发 安全交付平台!一次合作,终身售后!全程项目经理一对一跟进测试!公司以自研团队结合搭档圈,为用户提供安全快速稳定的软件源码开发服务!
Paypal支付,是目前网站流行的一种支付方式,Paypal也是需要依赖工具包来进行开发
paypal依赖包 composer require paypal/rest-api-sdk-php
用 composer 命令来下载依赖包
Paypal支付的参数也是要用到Paypal秘钥和ID,查看Paypal API文档,来进行开发,对接,
参考文档 https://learnku.com/articles/26282,这是参考文档,可以去翻阅查看
沙盒环境
沙盒环境就和本地环境差不多,是一种模拟Paypal的流程支付环境也称沙盒环境
沙盒登录 https://www.sandbox.paypal.com/c2/signin
参考这个文档进行调试和开发
下面是Paypal支付调取,同步回调和异步回调,退款的方法,
PayPal = new ApiContext(
new OAuthTokenCredential(
self::clientId,
self::clientSecret
)
);
//如果是沙盒测试环境不设置,请注释掉
// $this->PayPal->setConfig(
// array(
// 'mode' => 'live',
// )
// );
}
/**
* paypal支付
* @param $price float 金额
* @param $order_sn string 订单号
* @param $product string 商品名
* @param $description string 商品描述
* @param $shipping float 运费
*
*/
public function pay($price=10, $order_sn=123456, $product='商品', $description='描述内容', $shipping = 0)
{
$paypal = $this->PayPal;
$total = $price + $shipping;//总价
$payer = new Payer();
$payer->setPaymentMethod('paypal');
$item = new Item();
$item->setName($product)->setCurrency(self::Currency)->setQuantity(1)->setPrice($price);
$itemList = new ItemList();
$itemList->setItems([$item]);
$details = new Details();
$details->setShipping($shipping)->setSubtotal($price);
$amount = new Amount();
$amount->setCurrency(self::Currency)->setTotal($total)->setDetails($details);
$transaction = new Transaction();
$transaction->setAmount($amount)->setItemList($itemList)->setDescription($description)->setInvoiceNumber(uniqid());
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl(self::accept_url . '?success=true&order_sn='.$order_sn)->setCancelUrl(self::accept_url . '/?success=false');
$payment = new Payment();
$payment->setIntent('sale')->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]);
try {
$payment->create($paypal);
$approvalUrl = $payment->getApprovalLink();
echo json_encode(['code'=>200, 'msg'=>'成功!','url'=>$approvalUrl]);
//header("Location: {$approvalUrl}"); //自动跳转页面
exit();
} catch (PayPalConnectionException $e) {
error_log(date('Y-m-d H:i:s')." paypal pay fail: ".$e->getData()."\n", 3, self::error_log);
echo json_encode(['code'=>202, 'msg'=>$e->getData()]);
exit();
}
}
/**
* 同步回调方法
*/
public function Callback()
{
$success = trim($_GET['success']);
if ($success == 'false' && !isset($_GET['paymentId']) && !isset($_GET['PayerID'])) {
error_log(date('Y-m-d H:i:s')." paypal Callback fail: 取消付款"."\n", 3, self::error_log);
echo json_encode(['code'=>202, 'msg'=>'取消付款']);
exit();
}
$paymentId = trim($_GET['paymentId']);
$PayerID = trim($_GET['PayerID']);
$order_sn = trim($_GET['order_sn']); //订单号
if (!isset($success, $paymentId, $PayerID)) {
error_log(date('Y-m-d H:i:s')." paypal Callback fail: 支付失败"."\n", 3, self::error_log);
echo json_encode(['code'=>202, 'msg'=>'支付失败']);
exit();
}
if ((bool)$_GET['success'] === 'false') {
error_log(date('Y-m-d H:i:s')." paypal Callback fail:".'支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】'."\n", 3, self::error_log);
echo json_encode(['code'=>202,'msg'=>'支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】']);
exit();
}
$payment = Payment::get($paymentId, $this->PayPal);
$execute = new PaymentExecution();
$execute->setPayerId($PayerID);
try {
$payment->execute($execute, $this->PayPal);
// error_log(date('Y-m-d H:i:s')."同步回调:".json_encode($_GET)."\n", 3, self::error_log);
/*
* 将$paymentId保存到数据表
* */
echo json_encode(['code'=>200,'msg'=>'支付成功,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】,订单号【'.$order_sn.'】']);
exit();
} catch (Exception $e) {
error_log(date('Y-m-d H:i:s')." paypal Callback fail:".$e->getMessage(). ",支付失败,支付ID【" . $paymentId . "】,支付人ID【" . $PayerID . "】"."\n", 3, self::error_log);
echo json_encode(['code'=>202,'msg'=>$e . ',支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】']);
exit();
}
}
//异步回调(在控制台设置)
public function notify(){
//通知结果 https://developer.paypal.com/docs/api-basics/notifications/webhooks/notification-messages/
$json_data = file_get_contents('php://input');
// error_log(date('Y-m-d H:i:s')."异步回调:".$json_data."\n", 3, self::error_log);
$json_data = str_replace("'", '', $json_data);
$json_data = json_decode($json_data,true);
if(empty($json_data)){
error_log(date('Y-m-d H:i:s')."paypal notify fail: 参加为空!"."\n", 3, self::error_log);
exit();
}
try {
//自己打印$json_data的值看有那些是你业务上用到的
$id = $json_data['resource']['id']; //付款id(退款用),存表
$paymentId = $json_data['resource']['parent_payment']; //用此字段查询出订单表
if($json_data['resource_type']=='sale'){ //支付完成
/*
* 处理相关业务
* */
}elseif ($json_data['resource_type']=='refund'){ //退款成功
$total=$json_data['resource']['amount']['total']; //退款金额
/*
* 处理相关业务
* */
}
} catch (\Exception $e) {
//记录错误日志
error_log(date('Y-m-d H:i:s')."paypal notify fail:".$e->getMessage()."\n", 3, self::error_log);
exit();
}
return "success";
}
//退款
public function returnMoney($txn_id = "3LV45487XU194815F",$price=1){ //异步回调中拿到的id
try {
$amt = new Amount();
$amt->setCurrency('USD')
->setTotal($price); // 退款的费用
$refund = new Refund();
$refund->setAmount($amt);
$sale = new Sale();
$sale->setId($txn_id);
$refundedSale = $sale->refund($refund, $this->PayPal);
} catch (\Exception $e) {
// PayPal无效退款
// return json_decode(json_encode(['message' => $e->getMessage(), 'code' => $e->getCode(), 'state' => $e->getMessage()])); // to object
echo json_encode(['code' => 202,'msg'=> $e->getMessage()]);
exit();
}
$refundedSale = $refundedSale->toArray();
// 退款完成
if($refundedSale['state']=='completed'){
echo json_encode(['code' => 200,'msg' =>'退款成功!']);
exit();
}else{
echo json_encode(['code' => 202,'msg' =>'退款失败!']);
exit();
}
}
}
多线程同步开发
项目经理1v1跟进
源码定制交付
一次合作/终身售后
您的诉求已经提交请等待工作人员联系,快速通过请联系管理员!
欢迎访问我们的网站!我们非常重视用户的隐私权和信息安全,因此制定了以下用户协议,以明确我们与您之间的关系以及您在使用本网站时应遵守的条款。请您仔细阅读并同意本协议的所有条款,以便您能够合法、安全地使用本网站。如果您不同意本协议的任何内容,请立即停止使用本网站。
服务说明:本网站是一个提供定制软件开发服务和在线找技术搭档的互联网平台。我们保留随时更改、更新或暂停本网站的权利。我们会尽力确保网站的正常运行,但对于因技术问题、系统维护或其他原因导致的网站暂时不可用,我们不承担任何责任。
用户注册:用户需要通过提供手机号、微信扫码和其他必要信息来注册一个账户。您有责任保护您的用户名和密码,不得将其透露给任何第三方。对于因您的用户名和密码被泄露而导致的任何损失或损害,我们将不承担责任。
用户行为规范:用户应遵守中华人民共和国相关法律法规,不得发布或传播违法信息、侵犯他人权益的内容。用户应对其发布的内容负责,并承担因发布不当内容而引起的任何法律责任。
版权声明:本网站所包含的所有文字、图片、音频、视频等素材的著作权均归本网站所有(会员用户上传的默认承诺为不侵权的合法自有技术成果,本网站审核信息后可展示,所有权不归本网站)。未经本网站书面许可,任何单位或个人不得以任何形式复制、转载、修改或传播本网站的任何内容。对于侵犯本网站知识产权的行为,将依法追究其法律责任。
免责声明:本网站不对因使用本网站而引起的任何直接、间接、偶然、特殊或后果性的损害承担责任。包括但不限于利润损失、数据丢失、业务中断等。
适用法律和争议解决:本协议的签订、履行、解释及争议解决均适用中华人民共和国法律。如发生争议,双方应首先协商解决;协商不成的,任何一方均有权向有管辖权的人民法院提起诉讼。
本协议的解释权归本网站所有。如有未尽事宜,本网站保留最终解释权。
本协议自用户点击“同意”或“接受”按钮时生效。
欢迎访问我们的网站!我们致力于为您提供一个安全、可靠的在线环境。本隐私政策旨在说明我们在您使用我们的网站时如何收集、使用和保护您的个人信息。请仔细阅读以下内容,以了解我们的隐私政策。
在使用我们的网站时,我们可能会收集以下类型的信息:
a) 个人识别信息:如姓名、电子邮件地址、电话号码等。 b) 非个人识别信息:如浏览器类型、操作系统、设备类型、IP地址等。 c) 用户行为信息:如访问页面、点击链接、搜索查询等。
我们收集的信息将用于以下目的:
a) 提供、改进和个性化我们的服务。 b) 与您联系,回应您的询问和请求。 c) 发送您请求的或我们认为对您有帮助的信息。 d) 进行市场调研和分析,以改进我们的产品和服务。 e) 防止欺诈和其他非法活动。
我们不会出售、出租或以其他方式与第三方共享您的个人信息,除非:
a) 获得您的明确同意。 b) 与可信赖的合作伙伴共享,以提供您请求的服务。 c) 根据法律要求或政府机关的要求。 d) 为保护我们的权利、财产或安全。
我们采取合理的安全措施,以保护您的个人信息不受未经授权的访问、披露、更改或破坏。然而,请注意,没有任何一种电子存储方法是100%安全的。
我们的网站使用Cookie和类似的跟踪技术来收集有关您使用我们网站的信息。这些信息有助于我们分析和改进我们的网站,以及提供个性化的内容和广告。您可以通过浏览器设置拒绝接受Cookie,但这可能会影响您使用我们网站的能力。
我们的网站可能包含指向其他网站的链接。请注意,我们对其他网站的隐私政策和实践不承担任何责任。我们建议您在访问这些网站时查看其隐私政策。
我们可能会不时更新本隐私政策。请定期查看此页面,以确保您了解我们对个人信息的最新政策。
如果您对我们的隐私政策有任何疑问或建议,请通过以下联系方式与我们联系:
电子邮件:[wangye-101@163.com]
电话:+86-173-3019-6230
地址:中国石家庄市长安区吾悦广场2010室
感谢您的信任和支持!我们将竭诚为您提供更优质的服务。