1.特别感谢:
字节跳动团队的 官方同学 对问题的指导与支持
2.解决问题:
2.1、参数解析异常
最开始在调用的时候content-type类型使用的是form-data,而文档中要求的为application/json;此问题会造成参数解析异常报错
2.2、签名效验失败
2.2.1 在提交请求的时候需要使用使用json_encode函数;如果我们直接使用的json_code($data)的话会出现一个问题;就是回调的rul会被转义;加签的时候通不过;应该也不会产生回调。
2.2.2 文档中cp_extra字段表示‘开发者自定义字段,回调原样回传’;相信大部分的程序员会定义与业务相关的一段json;而json在被json_ecode()的时候也会被转义;我这里选择的是外部使用urlencode一下。
2.3、CD0015
此问题由前端小伙伴解决;没太听懂什么意思;大概的意思使用文档中的demo;在service这个字段中传5;而之前一直传输的是1
2.4、没有回调
因为是我目前处于测试阶段;所以使用的https中的ssl证书是自己生成的,为非安全证书;所以造成了在程序中没有看到请求的日志,应该是在https协议层就断开了;具体没有研究相关的问题。
tips:如果你的app_id或者pay_secret写错的话不会提示对应的字段错误;而是抛出签名校验异常。
--------------------------------------------------------废话说完了上代码-------------------------------------------------------
<?php
$url = 'https://developer.toutiao.com/api/apps/ecpay/v1/create_order';
$postdata['app_id'] = 'tt***********6';
$postdata['out_order_no'] = (string) time();
$postdata['total_amount'] = 2;
$postdata['subject'] = '中文';
$postdata['body'] = 'ddd';
$postdata['valid_time'] = 86400;
$postdata['cp_extra'] = urlencode(json_encode(['aaa'=>234,'bbb'=>'aaa']));
$postdata['notify_url'] = 'https://k**********et/mini/common/pay/dyinotify' ;
$postdata['thirdparty_id'] = '';
$postdata['disable_msg'] = 0;
$postdata['msg_page'] = 'asger';
$postdata['store_uid'] = '1';
//收银台加密
function getSign($params)
{
unset($params["sign"]);
unset($params["app_id"]);
unset($params["thirdparty_id"]);
$paramArray = [];
foreach ($params as $param) {
$paramArray[] = trim($param);
}
$paramArray[] = trim('p4xU0Qr*PG4');
sort($paramArray,2);
$paramArray = implode('&', $paramArray);
$signStr = trim($paramArray);
return md5($signStr);
}
$postdata['sign'] = getSign($postdata);
$res = json_post($url, $postdata);
print_r($res);
function json_post($url, $data = NULL)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
if (!$data) {
return 'data is null';
}
if (is_array($data)) {
$data = json_encode($data,320);
}
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json; charset=utf-8',
'Content-Length:' . strlen($data),
'Cache-Control: no-cache',
'Pragma: no-cache'
));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}