由于之前是供应商开发的系统(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,这里我被坑了半天。。。
Implicit conversion from float int loses precision php8Implicit Mysql8新增用户,mysql8配置权限,mysql8配置,mysql8配置文件 Linux命令,scp,scp命令,Linux复制 git commit git add centos git 搭建FTP,Linux FTP,禁止FTP登录ssh 上传文件,阿里云OSS上传,文件上传到OSS,OSS文件上传,OSS上传 微信支付,微信支付V3,PHP微信支付,微信nativePay支付,微信jsapi支付 微信支付,微信支付V3,PHP微信支付 bootstrap4 modal, lavarel The subversion command line tools are no longer provided by Xcode. 银联支付,tp5.1银联支付 支付宝即时到账,PHP支付宝 system libzip must be upgraded to version >= 0.11 CMake 3.0.2 or higher is required Class 'ZipArchive' not found