威富通 全付通 中信 支付 PHP 一些问题总结(签名机制,sign:This field is required,no start line ,回调机制,漏单)
之前接到一个关于威富通支付的项目 原先的签名方式是MD5 现在升级RSA256的 其中一些发生的问题在这里做下总结
1.签名
首先先通过PHP代码或者linux 的openssl获得一套公钥和私钥(确保服务器内装有openssl并确认版本),或者下载支付宝验签工具(同时支持本地window和mac操作系统)。
PHP代码如下:
$config = array(
“digest_alg” => “sha256”,
“private_key_bits” => 2048, //字节数 512 1024 2048 4096 等 ,不能加引号,此处长度与加密的字符串长度有关系,可以自己测试一下
“private_key_type” => OPENSSL_KEYTYPE_RSA, //加密类型
);
config);//提取私钥
openssl_pkey_export($res, $private_key);//生成公钥
res);
// var_dump($public_key);public_key[“key”];//显示数据
var_dump(public_key); //公钥
输出后的格式是每64位带空格的网页显示形式
生成后保存并上传至威富通支付平台,如下图:
上传后可根据在威富通给的demo中的config.php配置私钥从而和上传的公钥做匹配验签(流程demo中自带)
之后下载平台公钥(如上图)同样配置到config.php配置中来做双重验签(流程demo中自带)
当中发生的问题
sign:This field is required 威富通接口范围msg 或者 通过打印openssl_error_string() 获得no start line
可能情况
- RSA密钥格式不对 注意选择PKCS1 2048字节的格式
- PHP在config内保存的密钥需要注意增加首位 例如:
1. 公钥:
-----BEGIN PUBLIC KEY-----(换行"\n")
公钥内容(每64位换行"\n")
-----END PUBLIC KEY-----
私钥:
-----BEGIN PRIVATE KEY-----(换行"\n")
私钥内容(每64位换行"\n")
-----END PRIVATE KEY-----
这里推荐两种方式第一种
a 用以上形式手动保存两个pem文件(公钥、私钥),通过代码读取文件地址 file_get_contents()
b 通过PHP代码自动切割完成:
$private_key = ‘私钥’;
$public_key = ‘公钥’;
$search = [
“-----BEGIN RSA PRIVATE KEY-----”,
“-----END RSA PRIVATE KEY-----”,
“\n”,
“\r”,
“\r\n”
];
$private_key=str_replace($search,"",$private_key);
$private_key=$search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . $search[1];
$public_key = $this->cfg->C('public_rsa_key');
$search = [
"-----BEGIN PUBLIC KEY-----",
"-----END PUBLIC KEY-----",
"\n",
"\r",
"\r\n"
];
$public_key=str_replace($search,"",$public_key);
$public_key=$search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1];
3.私钥公钥在config.php中的设置错误,注意:私钥是自己生成的私钥而公钥是从威富通中生成的公钥
基本注意了这些RSA验签就能通过了,接下来再说下回调机制:
$this->reqHandler->setParameter(‘notify_url’,)
这是后台异步回调页面
这是支付成功后,威富通系统后台异步回调的连接设置为:该页面所在地址+request.php?method=callback。注:威富通文档中所描述的机制
实测确实有不少当场认定通知失败,之后补发的情况,所以在建议callback中判定,避免数据重复插入。
$this->reqHandler->setParameter(‘callback_url’,)
这个可配置任意可访问的页面代表用户在支付完成后跳转的页面可以设置为后续的功能页面。