一定要肯定回调地点的写的是不是指到是你写回调考证的谁人放内里,别到时刻在转头找毛病的时刻,太难了..
找到付出宝封装的验签类,rsaCheckV1(这个也是在app2.0接口内里)
这是付出宝已封装好的类:(引荐进修:PHP视频教程)
/** rsaCheckV1 & rsaCheckV2
* 考证署名
* 在运用本要领前,必需初始化AopClient且传入公钥参数。
* 公钥是不是是读取字符串照样读取文件,是依据初始化传入的值推断的。
**/
public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') {
$sign = $params['sign'];
$params['sign_type'] = null;
$params['sign'] = null;
$this->alipayrsaPublicKey = $rsaPublicKeyFilePath;
return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType);
}
public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType='RSA') {
$sign = $params['sign'];
$params['sign'] = null;
return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);
}
function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {
if($this->checkEmpty($this->alipayPublicKey)){
$pubKey= $this->alipayrsaPublicKey;
$res = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
}else {
//读取公钥文件
$pubKey = file_get_contents($rsaPublicKeyFilePath);
//转换为openssl花样密钥
$res = openssl_get_publickey($pubKey);
}
($res) or die('付出宝RSA公钥毛病。请搜检公钥文件花样是不是准确');
//挪用openssl内置要领验签,返回bool值
if ("RSA2" == $signType) {
$result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);
} else {
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
}
if(!$this->checkEmpty($this->alipayPublicKey)) {
//开释资本
openssl_free_key($res);
}
return $result;
}L
SQLite
SQLite3
SQLSRV
Sybase
tokyo_tyrant
另有就是别把这两个要领殽杂了,前者须要传signtype,后者不须要(前面两个要领都邑挪用第三个要领),另有一点很重要,就是这个要领的自身是从文件内里提取公钥的的,然则本人是直接传的,就把这个要领略加改动了一下,让它直接读取我传的公钥.这个验签要领返回的是(bool)true或许(bool)false,来推断验签是不是胜利.
在这里要注重三点:
1—注重公钥的准确性,另有效的是付出宝公钥不是你当初生成的公钥
2—区分这里的要领和付出宝接口自身要领的公钥猎取体式格局
3—注重接口要领自身的解释,很重要
付出宝的回调参数是以post的体式格局回传的,然则我们在测试的时刻能够直接把回调url直接写在地点栏内里,然后用get体式格局吸收,如许就不必拼参数了,效果是一样的(回调url能够记录在log文件内里),另有就是验签的时刻须要一切的回传参数一成不变的去验签,而这里本身须要什么参数就吸收什么参数就能够,这里就不多说了,就是一般的吸收参数的题目。下面给出我在考证参数时,磨练定单金额和商家编号的代码,仅做参考(我用的tp5):
public function check($receipt_amount,$buyer_pay_amount,$order_price,$app_id,$seller_email){
if($receipt_amount !== $order_price || $buyer_pay_amount !== $order_price){
// echo 1;
return $this->log('定单付出金额有误!');
}
//付出宝付出的一切参数
$alipay_config = Config::get('alipay_config');
if($app_id !== $alipay_config['appid']){
// echo 2;
return $this->log('商家编号有误!');
}
//考证收款商家是不是准确
if($seller_email !== $alipay_config['seller_id']){
// echo 3;
return $this->log('收款商家有误!');
}
return 'success';
}
磨练定单
这里重要就是磨练库存,这里最好用事物处置惩罚,(虽然你的定单量能够不一定回到这个田地),下面给出我的代码,仅做参考(tp5):
public function index($order_sn='')
{
if(isset($_POST['order_sn']) && empty($order_sn)){
$order_sn = $_POST['order_sn'];
}
$table = self::order_info($order_sn);
if($table == 'failure'){return 'false';}
$oid = $table['order_id'];
//经由过程定单id $oid 查询出定单中物品的id
$goodsTable = Db::name('goods');
$allgoods = Db::name("test1")->where('o_id', $oid)->field('g_id,g_num')->select();
foreach ($allgoods as $k => $v) {
//事务处置惩罚
$goodsTable->startTrans();//事物最先
try {
//推断库存数目
$goodsTable->query('update test2 set g_num = g_num-' . $v['g_num'] . ' where g_num >= ' . $v['g_num'] . ' and gid =' . $v['g_id']);
} catch (\Exception $e) {
$goodsTable->rollBack();//事物回滚
}
$goodsTable->commit();// 事物提交
}
//修正定单
$res = Db::name('test3')->where('order_sn',$order_sn)->update(['order_state' => '1','pay_time'=>time()]);
if($res != 0){
return 'success';
}
}
接下来就是把效果返回给付出宝就能够,失利:return ‘failure';胜利:return ‘success';到这里就完毕了.
以上就是php付出宝回调怎样写的细致内容,更多请关注ki4网别的相干文章!