卷曲时,我已经超出了我的深度.
我想将PayMill集成到我的站点(用Perl编写).
Paymill还没有Perl lib,所以我需要通过curl连接到它们.
我想将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工作.