首页 > 其他分享 >接入PayPal支付

接入PayPal支付

时间:2024-03-01 15:47:10浏览次数:22  
标签:paypal log 接入 signatureVerification PayPal headers amount 支付 new

注:最底部有sdk的代码文档说明,如是代码问题可直接参考底部官方sdk文档

安装SDK

composer require paypal/rest-api-sdk-php:*

 

生成支付链接

class Paypal
{
    protected $apiContext;
    protected $amount;
    protected $orderId;

    public function __construct()
    {
        // CLIENT_ID、SECRET_KEY从Apps & Credentials->API Credentials->REST API apps列表中获取,参考图01
        $this->apiContext = new ApiContext(
            new OAuthTokenCredential(
                "CLIENT_ID",
                "SECRET_KEY"
            )
        );

        $this->apiContext->setConfig(
            [
                'mode' => 'sandbox', //sandbox沙箱 或 'live'生产环境,根据你的环境设置
                'log.LogEnabled' => true,
                'log.FileName' => LOG_PATH . 'pay/paypal.log',
                'log.LogLevel' => 'DEBUG'
            ]
        );
    }

    /**
     * 设置金额
     * @param string $amount
     * @return $this
     */
    public function setAmount(string $amount): Paypal
    {
        $this->amount = $amount;
        return $this;
    }

    /**
     * 设置订单号
     * @param string $orderId
     * @return $this
     */
    public function setOrderId(string $orderId): Paypal
    {
        $this->orderId = $orderId;
        return $this;
    }

    /**
     * 拉起支付
     * @return string|null
     * @throws Exception
     */
    public function pay()
    {

        // 设置付款金额
        $payment = new Payment();
        $payment->setIntent("sale");

        // 设置payer信息
        $payer = new Payer();
        $payer->setPaymentMethod('paypal');

        $payment->setPayer($payer);
        // 设置付款金额
        $amount = new Amount();
        $amount->setTotal($this->amount);
        $amount->setCurrency('USD');

        // 创建交易
        $transaction = new Transaction();
        $transaction->setAmount($amount);
        $transaction->setCustom($this->orderId);

        // 将交易添加到付款
        $payment->addTransaction($transaction);

        // 设置重定向 URL
        $redirectUrls = new RedirectUrls();
        $redirectUrls->setReturnUrl("支付成功跳转链接")
            ->setCancelUrl("支付失败或取消支付跳转链接");
        $payment->setRedirectUrls($redirectUrls);
        // 创建付款并获取批准 URL
        try {
            $payment->create($this->apiContext);
// 获取支付链接,直接做跳转就行了 跳转效果参考图02 return $payment->getApprovalLink(); } catch (\PayPalConnectionException $e) { throw new Exception($e->getMessage()); } } }

图01

 

图02(注:测试支付时,在沙箱模式下用沙箱个人账号登录就可以支付,企业账号那是收款账号)

选择支付方式,点击继续查看订单就能跳转到支付成功的地方了

WebHook

从参考图01中的Default Application点击进去,在最底部有个Add WebHook

添加你的Webhook Url 然后选择Event types,

选择事件Event types的时候碰到一些坑。

1、支付成功之后 设定的Webhook Url没有接收到Webhook,网站找了好些事件都没收到,干脆选择了ALL Events所有事件,就有收到Webhook的消息。

2、设置webhook成功之后,可以使用paypal上的Webhooks simulator,模拟Webhooks请求来确认设定的webhook url是否能被paypal调用。(需要注意的是,这个只是用来测试链接是都可用,不能用来做webhook的回调验证)

 设定成功之后,Webhook ID要用来做webhook通知的验证

 1 public function completed()
 2 {
 3         
 4         $requestBody = file_get_contents('php://input');
 5         // getallheaders() 并非 PHP 标准库中的内置函数。这个函数通常是由 Apache 或 Nginx 提供的服务器软件自带的,用于获取 HTTP 请求的所有报头信息
 6         // 可以参考 https://php.net/manual/en/function.getallheaders.php 参考图03自己写一个
 7         $headers = getallheaders();
 8         $headers = array_change_key_case($headers, CASE_UPPER);
 9         $signatureVerification = new VerifyWebhookSignature();
10         $signatureVerification->setAuthAlgo($headers['PAYPAL-AUTH-ALGO']);
11         $signatureVerification->setTransmissionId($headers['PAYPAL-TRANSMISSION-ID']);
12         $signatureVerification->setCertUrl($headers['PAYPAL-CERT-URL']);
13         $signatureVerification->setWebhookId("7NR07992TT6909325"); // 此处填写Webhook id 参考上图
14         $signatureVerification->setTransmissionSig($headers['PAYPAL-TRANSMISSION-SIG']);
15         $signatureVerification->setTransmissionTime($headers['PAYPAL-TRANSMISSION-TIME']);
16 
17         $signatureVerification->setRequestBody($requestBody);
18         $request = clone $signatureVerification;
19         try {
20             $output = $signatureVerification->post($this->apiContext);
21         } catch (\Exception $ex) {
22             log_message('验证webhook失败' . $request, 'log', LOG_PATH . 'pay/notify/paypal/');
23             http_response_code(400);
24             exit(1);
25         }
26         $checkArray = json_decode($output);
27         if ($checkArray['verification_status'] !== "SUCCESS") {
28             log_message('验证失败' . $output, 'log', LOG_PATH . 'pay/notify/paypal/');
29             http_response_code(400);
30             exit(1);
31         }
32         // 获取自定义订单号 从$requestBody中获取就行了
33         
34 
35         http_response_code(200);
36 }

图03

 

附上sdk代码说明:

第一次调用:https://github.com/paypal/PayPal-PHP-SDK/wiki/Making-First-Call

webhook验证:https://github.com/paypal/PayPal-PHP-SDK/blob/master/sample/notifications/ValidateWebhookEvent.php

标签:paypal,log,接入,signatureVerification,PayPal,headers,amount,支付,new
From: https://www.cnblogs.com/chenjiangbin/p/18047103

相关文章

  • 从“[微信支付-现金红包]开发文档”来看接口文档和系统设计
    【微信支付】现金红包开发者文档:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1  文档特色1红包是什么?--在“产品说明”里图文并茂地有介绍。 数据词典-命名方面的瑕疵 红包的命名:发放红包接口名“sendredpack”里,“红包”命名为“......
  • 【JAVA】百度AI接入api使用流程-【黑图像上色】【步骤2】
    前言:根据API文档中java代码,使用idea编辑代码22.1进入网页,找到java代码https://cloud.baidu.com/doc/IMAGEPROCESS/s/Bk3bclns3 2.2新建java项目     2.3创建java类命名为 Colourize(就是刚才在网页里看到的Java代码的类名)  复制java代码  ......
  • 如何快速在钉钉群接入私有大模型
    利用阿里云计算巢Appflow,通过控制台配置即可顺利将您自己开发或微调的大模型接入钉钉或其他通信软件群聊,帮您解决以下各类场景的模型调用需求:在钉钉群接入自己微调的领域大模型做问答或智能答疑;微调后的大模型在钉钉群或其他群聊中共同测试效果......仅需简单几步,即可完成......
  • 【JAVA】百度AI接入api使用流程-【黑图像上色】【步骤1】
    前言以【黑白图像上色】为例讲解百度AI接口使用,方便新手小白接入,以超级简单的方式操作百度AI库使用步骤1.创建应用获取AK(APIKey),SK(SecretKey)1.1进入: 百度AI官网,在开放能力下面找到:黑白图像上色 1.2选择:立即使用 1.3在创建新应用下,填写相应的信息。注意:接口选择......
  • 小程序开发:接入腾讯云的人像动漫化api接口
    接口如下: 图片的传参方式有两种,一种是传图片的base64,一种是图片url: 我打算免费版使用base64,如果付费用户支持永久存储历史的图片记录(图片存储到腾讯云对象存储中)。前端框架我用的uview,所以我在页面简单使用了uview的上传组件,拿到图片本地路径后再转成base64,腾讯云的api......
  • Mybatis-Plus接入多个数据源
    导入依赖<!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.2.0</version></dependency>编辑properties#db1spring.d......
  • 已有Android项目接入有方yfb101错误,应用不停自动重启
    最近在接入有方信息的yfb101签字板,在按照demo导入所有数据和信息之后,却发现无法打开指纹设备,一直报错usbpermission没有。经过反复对比和新建项目进行比较,发现是因为cpu架构问题,因为有方的和之前的架构不一样,之前的在app/build.gradle下面限定了ndk{abiF......
  • C#接入vault方法
    在C#中接入Vault的方法有多种。以下是其中两种常用的方式:使用HashiCorpVault.NET客户端库(VaultSharp)进行接入:usingSystem;usingVaultSharp;usingVaultSharp.Core;classProgram{staticvoidMain(string[]args){//创建VaultClient对象并配......
  • 电子支付大屏:公共服务的未来之窗
    随着科技的飞速发展,我们的生活正在经历前所未有的变革。电子支付的出现,无疑是这场变革中的一大亮点,它不仅改变了我们日常的支付方式,更成为智慧城市建设的重要一环,为公众提供了更加便捷、高效的服务体验。 在以前,我们可能需要排队等待,为了一个简单的支付或是查询耗费大量的时间......
  • Godot C#接入steam sdk
    视频参考链接:HowididitGodotTutorial-ConnectyourgametoSteam+lobbyserver+Playfab1.下载资源首先使用C#版的godot记得下载.net。下载steamsdk:链接2.创建项目和平常的操作无异,我这里的项目名称是steamsdk。再在项目中添加一个CSharp代码,随便写点什么,比如......