在Perl中形成对PayMill的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工作. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |