先确定在支付的时候写的回调地址的正确性!!!!!!
一定要确定回调地址的写的是否指到是你写回调验证的那个放里面,别到时候在回头找错误的时候,太难了..

找到支付宝封装的验签类,rsaCheckV1(这个也是在app2.0接口里面)
这是支付宝已经封装好的类:(推荐学习:PHP视频教程)
/** rsaCheckV1 & rsaCheckV2<br>* 验证签名<br>* 在使用本方法前,必须初始化AopClient且传入公钥参数。<br>* 公钥是否是读取字符串还是读取文件,是根据初始化传入的值判断的。<br>**/<br>public function rsaCheckV1($params, $rsaPublicKeyFilePath,$signType='RSA') {<br>$sign = $params['sign'];<br>$params['sign_type'] = null;<br>$params['sign'] = null;<br>$this->alipayrsaPublicKey = $rsaPublicKeyFilePath;<br><br>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath,$signType);<br>}<br>public function rsaCheckV2($params, $rsaPublicKeyFilePath, $signType='RSA') {<br>$sign = $params['sign'];<br>$params['sign'] = null;<br>return $this->verify($this->getSignContent($params), $sign, $rsaPublicKeyFilePath, $signType);<br>}<br>function verify($data, $sign, $rsaPublicKeyFilePath, $signType = 'RSA') {<br><br>if($this->checkEmpty($this->alipayPublicKey)){<br><br>$pubKey= $this->alipayrsaPublicKey;<br>$res = "-----BEGIN PUBLIC KEY-----\n" .<br>wordwrap($pubKey, 64, "\n", true) .<br>"\n-----END PUBLIC KEY-----";<br>}else {<br>//读取公钥文件<br>$pubKey = file_get_contents($rsaPublicKeyFilePath);<br>//转换为openssl格式密钥<br>$res = openssl_get_publickey($pubKey);<br>}<br><br>($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确'); <br><br>//调用openssl内置方法验签,返回bool值<br>if ("RSA2" == $signType) {<br>$result = (bool)openssl_verify($data, base64_decode($sign), $res, OPENSSL_ALGO_SHA256);<br>} else {<br>$result = (bool)openssl_verify($data, base64_decode($sign), $res);<br>}<br><br>if(!$this->checkEmpty($this->alipayPublicKey)) {<br>//释放资源<br>openssl_free_key($res);<br>}<br><br>return $result;<br>}L<br>SQLite<br>SQLite3<br>SQLSRV <br>Sybase<br>tokyo_tyrant<br>
还有就是别把这两个方法混淆了,前者需要传signtype,后者不需要(前面两个方法都会调用第三个方法),还有一点很重要,就是这个方法的本身是从文件里面提取公钥的的,但是本人是直接传的,就把这个方法稍加改动了一下,让它直接读取我传的公钥.这个验签方法返回的是(bool)true或者(bool)false,来判断验签是否成功.
在这里要注意三点:
1—注意公钥的正确性,还有用的是支付宝公钥不是你当初生成的公钥<br>2—区别这里的方法和支付宝接口本身方法的公钥获取方式<br>3—注意接口方法本身的注释,很重要<br>
支付宝的回调参数是以post的方式回传的,但是我们在测试的时候可以直接把回调url直接写在地址栏里面,然后用get方式接受,这样就不用拼参数了,结果是一样的(回调url可以记录在log文件里面),还有就是验签的时候需要所有的回传参数原封不动的去验签,而这里自己需要什么参数就接收什么参数就可以,这里就不多说了,就是正常的接受参数的问题。下面给出我在验证参数时,检验订单金额和商家编号的代码,仅做参考(我用的tp5):
public function check($receipt_amount,$buyer_pay_amount,$order_price,$app_id,$seller_email){<br> if($receipt_amount !== $order_price || $buyer_pay_amount !== $order_price){<br>// echo 1;<br> return $this->log('订单支付金额有误!');<br> }<br> //支付宝支付的所有参数<br> $alipay_config = Config::get('alipay_config');<br> if($app_id !== $alipay_config['appid']){<br>// echo 2;<br> return $this->log('商家编号有误!');<br> }<br><br> //验证收款商家是否正确<br> if($seller_email !== $alipay_config['seller_id']){<br>// echo 3;<br> return $this->log('收款商家有误!');<br> }<br> return 'success';<br> }<br>
检验订单
这里主要就是检验库存,这里最好用事物处理,(虽然你的订单量可能不一定回到这个地步),下面给出我的代码,仅做参考(tp5):
public function index($order_sn='')<br> {<br> if(isset($_POST['order_sn']) && empty($order_sn)){<br> $order_sn = $_POST['order_sn'];<br> }<br><br> $table = self::order_info($order_sn);<br> if($table == 'failure'){return 'false';}<br> $oid = $table['order_id'];<br> //通过订单id $oid 查询出订单中物品的id<br> $goodsTable = Db::name('goods');<br> $allgoods = Db::name("test1")->where('o_id', $oid)->field('g_id,g_num')->select();<br> foreach ($allgoods as $k => $v) {<br> //事务处理<br> $goodsTable->startTrans();//事物开始<br> try {<br> //判断库存数量<br> $goodsTable->query('update test2 set g_num = g_num-' . $v['g_num'] . ' where g_num >= ' . $v['g_num'] . ' and gid =' . $v['g_id']);<br><br> } catch (\Exception $e) {<br> $goodsTable->rollBack();//事物回滚<br> }<br><br> $goodsTable->commit();// 事物提交<br> }<br><br> //修改订单<br> $res = Db::name('test3')->where('order_sn',$order_sn)->update(['order_state' => '1','pay_time'=>time()]);<br> if($res != 0){<br> return 'success';<br> }<br> }<br>
接下来就是把结果返回给支付宝就可以,失败:return ‘failure';成功:return ‘success';到这里就结束了.
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











