加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中形成对PayMill的CURL请求

发布时间:2020-12-15 23:20:25 所属栏目:大数据 来源:网络整理
导读:卷曲时,我已经超出了我的深度. 我想将PayMill集成到我的站点(用Perl编写). Paymill还没有Perl lib,所以我需要通过curl连接到它们. 我已完成前端JS Paymill集成,并从PayMill收到付款令牌. 我现在需要将从Paymill收到的令牌传递给我的后端并使用curl要求PayMil
卷曲时,我已经超出了我的深度.
我想将PayMill集成到我的站点(用Perl编写).
Paymill还没有Perl lib,所以我需要通过curl连接到它们.

我已完成前端JS Paymill集成,并从PayMill收到付款令牌.

我现在需要将从Paymill收到的令牌传递给我的后端并使用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密钥,尽管这里的文档不清楚.

我已经看过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;

但是因为Access Denied错误而失败,我认为这是因为Paymill没有找到我的密钥,因为我搞乱了Curl(假设-u应该是secret_key).

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

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

UPDATE

非常好的答案,感谢大家的帮助,现在正在努力.我最终选择了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及类似信息未能使用凭证发送第二个请求.解决方案是“强制”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工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读