由于之前是供应商开发的系统(asp.net),当初用的是老版本的支付宝,所以,合作商没有给到支付宝公钥和私钥,所以目前想转成PHP的,只能根据以前的配置来开发新的支付。
先去找了一下以前的文档https://docs.open.alipay.com/62/104743/,根据文档把各个参数都确认好之后开始整理代码:
配置(app.php里):
//支付宝即时到账配置
'zfb' => [
//合作伙伴身份
'partner' => "",
//收款支付宝账号
'seller_email' => "",
//交易安全检验码,由数字和字母组成的32位字符串
'key' => "",
//字符编码格式 目前支持 gbk 或 utf-8
'input_charset' => "utf-8",
//签名方式,选择项:RSA、DSA、MD5
'sign_type' => "MD5",
//异步通知地址
'notify_url' => url('/index/payments/alipayCallback'),
//同步回调地址
'return_url' => url('/index/payments/alipayCheck'),
],
控制器代码:
我没有用form跳转,而是用的tp在程序里跳转
public function getAlipayUrl(){
$url = 'https://mapi.alipay.com/gateway.do?';
$param = [];
$param['_input_charset'] = config('app.zfb.input_charset');
$param['body'] = "简介";
$param['notify_url'] = getHostDomain().config('app.zfb.notify_url');
$param['out_trade_no'] = "唯一订单号";
$param['partner'] = config('app.zfb.partner');
$param['payment_type'] = '1';
$param['return_url'] = getHostDomain().config('app.zfb.return_url');
$param['seller_email'] = config('app.zfb.seller_email');
$param['service'] = 'create_direct_pay_by_user';
$param['subject'] = "商品名称";
$param['total_fee'] = "费用";
$param['price'] = "单价";
$param['quantity'] = "数量";
$param['show_url'] = getHostDomain().url('/index');
$param['anti_phishing_key'] = "";
$param['exter_invoke_ip'] = "";
$param['sign'] = $this->MakeSign($param);
$param['sign_type'] = config('app.zfb.sign_type');
$this->redirect($url.$this->ToUrlParamsOnly($param));
}
/**
* 格式化参数格式化成url参数
*/
public function ToUrlParams($param)
{
ksort($param);
$buff = "";
$tempArr = [];
foreach ($param as $k => $v)
{
if($k != "sign" && $k != 'sign_type' && $v != "" && !is_array($v)){
$tempArr[] = $k . "=" . $v ;
}
}
$buff = implode('&', $tempArr);
$buff = trim($buff, "&");
return $buff;
}
/**
* 生成签名
* @param 参数
* @return 签名
*/
public function MakeSign($param)
{
//签名步骤一:按字典序排序参数
ksort($param);
$string = $this->ToUrlParams($param);
//签名步骤二:在string后加入KEY
$string = $string . config('app.zfb.key');//这个地方尤其要注意,是生成的字符串直接连接key,不需要&连接
//签名步骤三:MD5加密或者HMAC-SHA256
$string = md5($string);
return $string;
}
/**
* 格式化参数格式化成url参数
*/
public function ToUrlParamsOnly($param)
{
$buff = "";
foreach ($param as $k => $v)
{
if($v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
然后就可以正常调用了,调用成功的话会显示二维码的支付页面:
如果支付页面提示:
ILLEGAL_SIGN
那肯定是签名错误,检查签名的字段和最后的key,这里我被坑了半天。。。