我已经完成了前端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;
然而,这会导致“访问被拒绝”的错误,我想是因为Paymill没有找到我的密钥,因为我在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
}
-u
选项用于向请求中添加凭据(例如用户名/密码)(请参见http://curl.haxx.se/docs/manpage.html#-u)。 - simbabque