gpt4 book ai didi

perl - 在 Perl 中向 PayMill 发送 CURL 请求

转载 作者:行者123 更新时间:2023-12-04 23:24:59 35 4
gpt4 key购买 nike

我的 curl 超出了我的深度。
我想将 PayMill 集成到我的网站(用 Perl 编写)中。
Paymill 还没有 Perl 库,所以我需要通过 curl 连接到它们。

我已经完成了前端JS Paymill的集成,并收到了PayMill的支付 token 。

我现在需要将从 Paymill 收到的 token 传递到我的后端,并使用 curl 要求 PayMill 完成交易并向用户收费。
在这一点上,我被困住了。

要进行交易,PayMill 文档说我必须执行以下操作:

curl https://api.paymill.de/v2/transactions \
-u b94a7550bd908877cbae5d3cf0dc4b74: \
-d "amount=4200" \
-d "currency=EUR" \
-d "token=098f6bcd4621d373cade4e832627b4f6" \
-d "description=Test Transaction"

我相信 -u 是验证我的请求的 Paymill key ,尽管此处的文档不清楚。

我看过 WWW::Curl::Easy、Net:Curl::Easy 和 LWP::Curl,但是这些方法的文档中没有任何内容让我清楚如何形成上面的查询。

我已经尝试过(并没有真正相信它会起作用),只是如上所述在 perl 中编码一个字符串;
my $request = '-u ' . $private_key . " ";
foreach my $key (keys %$params_in) {
$request .= '-d "' . lc($key) .'='.$params_in->{$key} . ' ';
}

然后将 $request 传递给我的 curl 尝试,如下所示;
my $curl = WWW::Curl::Easy->new;
$curl->setopt(WWW::Curl::Easy::CURLOPT_HEADER(), 1);
$curl->setopt(WWW::Curl::Easy::CURLOPT_URL(), $paymill_server);
$curl->setopt(WWW::Curl::Easy::CURLOPT_POST(), 1);
$curl->setopt(WWW::Curl::Easy::CURLOPT_POSTFIELDS(), $request);

my $response;
$curl->setopt(WWW::Curl::Easy::CURLOPT_WRITEDATA(), \$response);

my $retcode = $curl->perform;

但是,由于访问被拒绝错误而失败,我认为这是因为 Paymill 没有找到我的 key ,因为我弄乱了 Curl(假设 -u 应该是 secret_key)。

我觉得我在这里遗漏了一些明显的东西。

有人能指出我正确的方向如何做到这一点吗?
谢谢

更新

很好的答案,感谢大家的帮助,现在可以使用了。我最终采用了 Matthias 的解决方案,最终完成交易的完整解决方案如下所示;
use LWP::UserAgent;
use MIME::Base64;
use JSON::XS;

my $ua = LWP::UserAgent->new;
$ua->default_header(Authorization => "Basic " . encode_base64(private_key));

my $response = $ua->post(https://api.paymill.de:443/v2/transactions , $params );
if ( $response->is_success ) {
my $obj = eval { decode_json $response->content } || {};
etc
}

最佳答案

像其他答案一样,最好的方法是使用 LWP::UserAgent 来处理请求。

编辑:由于 PAYMILL 一段时间以来一直在发送质询响应,因此我更新了代码。

由于 Paymill 不符合 RFC 2616,第 14.47 节(API 不发送质询响应)LWP::UserAgent 等无法发送带有凭据的第二个请求。解决方案是通过将凭据添加为 header 来“强制” LWP::UserAgent 将凭据与第一个请求一起发送:

use LWP::UserAgent;
use MIME::Base64;

my $ua = LWP::UserAgent->new;
# Use the following line no longer:
# $ua->default_header(Authorization => "Basic " . encode_base64("your PRIVATE key"))
$ua->credentials('api.paymill.de:443', '', 'YOUR PRIVATE KEY');

# Dumping only
use Data::Dumper;
print Dumper($ua->get("https://api.paymill.de:443/v2/clients"));

披露:我在 Paymill 工作。

关于perl - 在 Perl 中向 PayMill 发送 CURL 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14238290/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com