<?php
/**
 * Desc 注意生成的私钥和公钥是2048位,PKCS1(PHP使用,如果是java,使用PKCS8),编码GBK,然后用支付宝的秘钥生成公钥来生成。这个网关是为了用来支付宝做notify_url的,所以支付宝必须确保验证签名正确,你的接口安全,才能让你使用开发者模式。* Author: xiexingqiao* Date: 2017/5/22* Time: 10:34*/class AliNotifyController
{
private $config = array (//应用ID,您的APPID。'app_id' => "****",//商户私钥,您的原始格式私钥,一行字符串'merchant_private_key' => '-----BEGIN PRIVATE KEY-----
****
-----END PRIVATE KEY-----
',//商户应用公钥,一行字符串'merchant_public_key' => "***",//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。'alipay_public_key' => '****',//没有-----BEGIN PUBLIC KEY-----和-----END PUBLIC KEY-----//编码格式只支持GBK。'charset' => "GBK",//支付宝网关'gatewayUrl' => "https://openapi.alipay.com/gateway.do",//签名方式'sign_type'=>"RSA2");/*** ali服务窗应用网关验证*/public function actionGateway(){
//        $_POST['service']='alipay.service.check';
//        $_POST['sign']='ntjOmXFGJMdfdMnrTL5rEp9QG8d0lDEoGg3ZHvqemHeI8BlQoEsFbhEn0IfQT+pvfJz5RCuE+3Qh1X7I4z5iTIiGjDBstc0xeuiAmtP9TrJZuw2jUAODFB9qOwBJLNcWlKHUGTU/db/qRsJQCj8EjoJvSi9MRM/xKv/XmduS/C4=';
//        $_POST['sign_type']='RSA2';
//        $_POST['charset']='GBK';
/*        $_POST['biz_content']='<?xml version="1.0" encoding="gbk"?><XML><AppId><![CDATA['.$this->config['app_id'].']]></AppId><FromUserId></FromUserId><CreateTime><![CDATA[1406083506817]]></CreateTime><MsgType><![CDATA[event]]></MsgType><EventType><![CDATA[verifygw]]></EventType><ActionParam></ActionParam><AgreementId></AgreementId><AccountNo></AccountNo></XML>';*/$sign = Yii::$app->request->post( "sign",$_POST['sign'] );$sign_type =  Yii::$app->request->post ( "sign_type" ,$_POST['sign_type']);$biz_content =  Yii::$app->request->post ( "biz_content",$_POST['biz_content'] );$service =  Yii::$app->request->post( "service" ,$_POST['service']);$charset =  Yii::$app->request->post( "charset" ,$_POST['charset']);if (empty ( $sign ) || empty ( $sign_type ) || empty ( $biz_content ) || empty ( $service ) || empty ( $charset )) {Yii::info("some parameter is empty.");exit ();}$sign_verify = $this->verify($_POST);//,$this->config['alipay_public_key']if($service == 'alipay.service.check'){// 验证签名,开通开发者模式if(!$sign_verify){Yii::info('sign qianming verfiy fail.');$this->verifygw(false);}else{Yii::info('sign qianming verfiy success.');$this->verifygw(true);}return true;}elseif($service == 'alipay.mobile.public.message.notify'){// 处理收到的消息}Yii::info('exception happen');}/* 使用支付宝的公钥对支付宝来的消息进行验签 */private  function verify($params) {Yii::info(json_encode($params));$sign = $params['sign'];unset($params['sign']);ksort($params);$data = http_build_query($params);$AliRsaPublicKeyFilePath=Yii::getAlias('@app').'/config/alipay_public_key_sha256.pem';if(file_exists($AliRsaPublicKeyFilePath)){/* 读取公钥文件,PEM格式 */$pubKey = file_get_contents($AliRsaPublicKeyFilePath);}else{Yii::info('alipay_public_key_sha256.pem not exist,verify fail');exit;}/* 转换为openssl格式密钥 */$res = openssl_get_publickey($pubKey);if(!$res){Yii::info('转换为openssl格式密钥失败');exit;}/* 调用openssl内置方法验签 */$result = (bool) openssl_verify($data, base64_decode($sign), $res);/* 释放资源 */openssl_free_key($res);/* 返回验签结果 */return $result;}private  function verifygw($is_sign_success) {if ($is_sign_success) {$response_xml = "<success>true</success><biz_content>" . $this->config ['merchant_public_key'] . "</biz_content>";} else { // echo $response_xml;$response_xml = "<success>false</success><error_code>VERIFY_FAILED</error_code><biz_content>" . $$this->config ['merchant_public_key'] . "</biz_content>";}$mysign=$this->alonersaSign($response_xml,$this->config['merchant_private_key'],$this->config['sign_type']);$return_xml = "<?xml version=\"1.0\" encoding=\"".$this->config['charset']."\"?><alipay><response>".$response_xml."</response><sign>".$mysign."</sign><sign_type>".$this->config['sign_type']."</sign_type></alipay>";Yii::info($return_xml);echo $return_xml;}/*** RSA单独签名方法,未做字符串处理,字符串处理见getSignContent()* @param $data 待签名字符串* @param $privatekey 商户私钥,根据keyfromfile来判断是读取字符串还是读取文件,false:填写私钥字符串去回车和空格 true:填写私钥文件路径* @param $signType 签名方式,RSA:SHA1     RSA2:SHA256* @param $keyfromfile 私钥获取方式,读取字符串还是读文件* @return string* @author mengyu.wh*/public function alonersaSign($data,$privatekey,$signType = "RSA") {$res = openssl_get_privatekey($privatekey);if(!$res){Yii::info('您使用的私钥格式错误,请检查RSA私钥配置');exit;}if ("RSA2" == $signType) {openssl_sign($data, $sign, $res, OPENSSL_ALGO_SHA256);} else {openssl_sign($data, $sign, $res);}$sign = base64_encode($sign);return $sign;}
}

支付宝服务窗验证签名相关推荐

  1. php 支付宝回调验证失败,支付宝回调验证签名失败怎么解决?

    支付宝回调验证签名失败的解决方法:1.确保使用的验证签名是正确的:2.确保传入的参数是正确的:3.要在支付宝中给你的回调域名授权:3.确保加密解密类型为RSA2. 回调接口是支持扫码支付方式的回调的, ...

  2. 支付宝回调验证签名失败

    回调接口是支持扫码支付方式的回调的,最近业务需要又需要支持移动app的支付方式,回调时却签名验证失败.在排除代码.参数.编码格式等问题后,最终确定是支付宝这两种支付方式回调使用的支付宝公钥不一样导致的 ...

  3. 支付宝服务窗 开发 验证

    微信公众账号风风火火了了这么久,支付宝按捺不住终于也在今天推出了服务窗(类似微信公众账号),无奈就是没有php的demo,不过还是提供了sdk.希望以后支付宝同学勤奋写,直接写demo! 还有就是,本 ...

  4. java 支付宝回调校验签名_支付宝异步回调验证签名

    今天做支付宝接口回调这块,不得不说,弄的我焦头烂额,翻了很多陈年旧帖,试了无数种解决坑的方案,在我成功解决的一瞬间,觉得非常有必要记录一下这些坑. 签名验证错误的检查顺序(这里是基于使用官方给的dem ...

  5. 支付宝服务窗API接口开发php版本

    支付宝服务窗API接口的开发对于许多网站要充值的朋友来讲是非常的重要的,今天我们就一起来看一篇关于php版本的支付宝服务窗API接口的开发例子. 这两天没事要接入支付宝服务窗,看支付宝的DEMO,我的 ...

  6. 支付宝服务窗接入常见问题说明

    近日将一产品接入支付宝服务窗,接入过程遇到几点磕绊,记下也为后来者有所借鉴.支付宝服务窗无论界面到技术接入,同微信公众号相似度还是比较高的,做过公众号接入的,服务窗接入就是轻车熟路了. 接入前的准备工 ...

  7. 【支付宝服务窗】JEECG支付宝服务窗平台指南

    一. 支付宝服务窗的申请与准备工作: 申请详见官方文档: 1. 使用RSA密钥生成工具生成相关的公钥. a) 密钥生成工具下载地址,点击下载 b) 使用工具生成密钥: 在工具目录当中也会生成三个pem ...

  8. 服务窗 菜单 php,支付宝服务窗API接口开发php版本

    支付宝服务窗API接口的开发对于许多网站要充值的朋友来讲是非常的重要的,今天我们就一起来看一篇关于php版本的支付宝服务窗API接口的开发例子. 这两天没事要接入支付宝服务窗,看支付宝的DEMO,我的 ...

  9. 修改支付宝服务窗开发者网关

    接入支付宝服务窗,修改支付宝网关时,总是提示应用网关响应异常等错误,又苦于没有办法查询问题.经过几番调试,总结出些许经验. 主要分为以下几步: 支付宝发验证网关请求 在商户服务窗后天提交要修改的服务窗 ...

最新文章

  1. python soup提取叶子标签_python3用BeautifulSoup抓取div标签
  2. Oracle 基础系列之1.1 oracle的安装
  3. 史上比较用心的纯代码实现 AutoLayout
  4. 关于Java你不知道的10件事
  5. Python安装FrankMocap实现3D人体姿态估计
  6. java mvc建包结构_Java SSM框架的配置方法、MVC结构的分析、响应的流程
  7. 【struts框架】第一节Action-struts基础
  8. PhpSpreadsheet 电子表格(excel) PHP处理笔记
  9. JimuReport积木报表——如何设计一张带二维码的打印报表?
  10. JQuery修改background-image背景图片
  11. Ubuntu(Deepin)搭建Android开发环境(Android Studio)
  12. Linux运维工程师工作内容总结
  13. 高德地图打包后不能使用,高德导航View不显示,高德地图导航组件黑屏的问题;
  14. git add 之后没有push 怎么找回代码?
  15. Easycwmp_源码分析
  16. iOS开发 ☞ emoji表情大全
  17. Kali Linux渗透测试——WEB渗透(一)
  18. matlab中set position,Matlab中set函数
  19. Maven导入依赖时jar包出现unknown
  20. 麦咖啡阻挡正常打开Excel文件

热门文章

  1. 第一颗国产 HDMI2.0 至带音频的四端口 LVDS 芯片 LT6211UX
  2. Arduino 学习笔记_3 案例:按下按钮生成一位随机数字,在数码管中显示
  3. 手机网页弹窗关不掉_弹窗广告关不掉?这5种方法永久关闭电脑弹窗广告!
  4. 柬埔寨已试用央行数字货币,有望本季度投入运营
  5. 调起 手机中的 相机 和 图库 来设置头像
  6. 整站优化部分关键词排名卡在第二页上不去的原因
  7. 互联网资讯:高德打车推“出游无忧”服务,乘客遇恶意绕路等七类情况可获额外补偿
  8. 程序人生:2023年,软件测试还吃香吗?学软件测试还有前途吗?
  9. dbPaaS实战:租户和资源管理
  10. R语言进行COX时变系数模型(含时间依存协变量的Cox回归模型)