Page tree
Skip to end of metadata
Go to start of metadata

В PayPal на странице настройки приложений необходимо открыть созданное приложение и настроить вебхук.

Webhook URL: https://hpd_url/paypal_invoices/main/invoice_updated

Event types: Invoicing invoice paid

После успешного создания отобразится Webhook ID, который потребуется при настройке HPD.

Пример конфигурационного файла

В ключах root_cert и intermediate_cert должны лежать корневой и промежуточный сертификат PayPal. В примере ниже лежат актуальные до указанной в примере даты.

 

hpd.yml
listeners:
  http:
    plain:
      plugins:
        - paypal_invoices/main
 
workers:
  - listeners:
    - http/plain
 
plugins:
  paypal_invoices:
    main:
      bank_code: PayPal
      bank_account: PayPal

      # ID созданного вебхука
	  webhook_id: 0UG81447LU666745N
      # корневой сертификат (root)
      # end date: Nov 10 00:00:00 2031 GMT
      root_cert: |	
        -----BEGIN CERTIFICATE-----
        MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
        MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
        d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
        ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
        MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
        LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
        RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
        +9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
        PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
        xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
        Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
        hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
        EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
        MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
        FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
        nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
        eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
        hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
        Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
        vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
        +OkuE6N36B9K
        -----END CERTIFICATE-----
      # сертификат посредника (intermediate)
      # end date: Oct 22 12:00:00 2028 GMT
      intermediate_cert: |
        -----BEGIN CERTIFICATE-----
        MIIEtjCCA56gAwIBAgIQDHmpRLCMEZUgkmFf4msdgzANBgkqhkiG9w0BAQsFADBs
        MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
        d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
        ZSBFViBSb290IENBMB4XDTEzMTAyMjEyMDAwMFoXDTI4MTAyMjEyMDAwMFowdTEL
        MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
        LmRpZ2ljZXJ0LmNvbTE0MDIGA1UEAxMrRGlnaUNlcnQgU0hBMiBFeHRlbmRlZCBW
        YWxpZGF0aW9uIFNlcnZlciBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
        ggEBANdTpARR+JmmFkhLZyeqk0nQOe0MsLAAh/FnKIaFjI5j2ryxQDji0/XspQUY
        uD0+xZkXMuwYjPrxDKZkIYXLBxA0sFKIKx9om9KxjxKws9LniB8f7zh3VFNfgHk/
        LhqqqB5LKw2rt2O5Nbd9FLxZS99RStKh4gzikIKHaq7q12TWmFXo/a8aUGxUvBHy
        /Urynbt/DvTVvo4WiRJV2MBxNO723C3sxIclho3YIeSwTQyJ3DkmF93215SF2AQh
        cJ1vb/9cuhnhRctWVyh+HA1BV6q3uCe7seT6Ku8hI3UarS2bhjWMnHe1c63YlC3k
        8wyd7sFOYn4XwHGeLN7x+RAoGTMCAwEAAaOCAUkwggFFMBIGA1UdEwEB/wQIMAYB
        Af8CAQAwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEF
        BQcDAjA0BggrBgEFBQcBAQQoMCYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
        Z2ljZXJ0LmNvbTBLBgNVHR8ERDBCMECgPqA8hjpodHRwOi8vY3JsNC5kaWdpY2Vy
        dC5jb20vRGlnaUNlcnRIaWdoQXNzdXJhbmNlRVZSb290Q0EuY3JsMD0GA1UdIAQ2
        MDQwMgYEVR0gADAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5j
        b20vQ1BTMB0GA1UdDgQWBBQ901Cl1qCt7vNKYApl0yHU+PjWDzAfBgNVHSMEGDAW
        gBSxPsNpA/i/RwHUmCYaCALvY2QrwzANBgkqhkiG9w0BAQsFAAOCAQEAnbbQkIbh
        hgLtxaDwNBx0wY12zIYKqPBKikLWP8ipTa18CK3mtlC4ohpNiAexKSHc59rGPCHg
        4xFJcKx6HQGkyhE6V6t9VypAdP3THYUYUN9XR3WhfVUgLkc3UHKMf4Ib0mKPLQNa
        2sPIoc4sUqIAY+tzunHISScjl2SFnjgOrWNoPLpSgVh5oywM395t6zHyuqB8bPEs
        1OG9d4Q3A84ytciagRpKkk47RpqF/oOi+Z6Mo8wNXrM9zwR4jxQUezKcxwCmXMS1
        oVWNWlZopCJwqjyBcdmdqEU79OX2olHdx3ti6G8MdOu42vi/hw15UJGQmxg7kVkn
        8TUoE6smftX3eg==
        -----END CERTIFICATE-----

Документация

Счета: https://developer.paypal.com/docs/api/invoicing/v2/

Вебхуки: https://developer.paypal.com/docs/api-basics/notifications/webhooks/rest/

Схема работы

При оплате счета PayPal отправляет событие на url, указанный при создании вебхука.

HPD принимает запрос, верифицирует его и проводит платежи на указанный в поле resource.invoice.detail.reference номер счета в Гидре.

Примечание

В поле resource.invoice.detail.reference тела запроса должен быть указан номер счета из Гидры, на который он выставлен.

Если создание счетов PayPal реализовано с помощью https://gitlab.com/latera/hydra-scripts/-/tree/master/paypal, то необходимо обновить этот репозиторий.

Поддержка мультивалютных счетов PayPal

Для возможности оплаты счетов в разных валютах необходимо создать отдельные экземпляры плагина paypal_invoices в HPD и настроить проксирование в NGINX в зависимости от указанной в теле запроса валюты.

Если NGINX установлен нативно, то необходимо установить модуль поддержки LUA - apt-get install  libnginx-mod-http-lua
В случае с NGINX в докер понадобится собрать новый образ веб-сервера. Подойдет рецепт из примера отсюда: Подготовка NGINX в Docker с установкой дополнительных модулей


После чего настроить проксирование в NGINX

 

/etc/nginx/sites-enabled/hpd_proxy
upstream hpd_server {
  server 127.0.0.1:9080 fail_timeout=0;
}
server {
  listen 9443 deferred ssl;
  listen 443 deferred ssl;
  client_max_body_size 15M;
  ssl_certificate /etc/ssl/autogenerated-cert.pem;
  ssl_certificate_key /etc/ssl/autogenerated-privkey.pem;
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  location / {
    proxy_set_header HTTPS on;
    proxy_set_header X_FORWARDED_PROTO https;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_read_timeout 30s;
    if (!-f $request_filename ) {
      set $upstream '';
      access_by_lua '
        ngx.req.read_body()
        local data = ngx.req.get_body_data()
        local match = ngx.re.match(ngx.var.request_body, "currency_code\\\":\\\"USD")
        if match then
          ngx.var.upstream = "hpd_server/paypal_invoices/usd/invoice_updated"
        else
          local match = ngx.re.match(ngx.var.request_body, "currency_code\\\":\\\"EUR")
          if match then
            ngx.var.upstream = "hpd_server/paypal_invoices/eur/invoice_updated"
          else
            ngx.var.upstream = "hpd_server/paypal_invoices/rub/invoice_updated"
          end
        end
      ';
      proxy_pass http://$upstream;
      break;
    }
  }
} 


 

  • No labels