支付宝生活号(原服务窗)应用网关配置
RSA秘钥生成下载支付宝官方demo导入Laravel框架内1.新建资源目录,已建可忽略2.删除不必要的文件3.配置confi.php 文件4.新建获取config配置文件类 GetConfig.php5.修改HttpRequst.php文件6.配置Laravel 访问路径7.修改Gateway.php文件最后测试,验证
RSA秘钥生成
这里可以采用蚂蚁金服(支付宝)秘钥生成工具,直接生成秘钥对。
地址:https://docs.open.alipay.com/291/105971/
上图秘钥需要到生活号后台配置下,并获取支付宝公钥备用
下载支付宝官方demo
目前官网有提供完整的demo,下载地址:https://docs.open.alipay.com/54/104507/
导入Laravel框架内
1.新建资源目录,已建可忽略
app目录下新建“Libaries”目录用来存放相关文件,并将demo包解压到这个目录
源文件夹“ServiceWindow_Demo_php” 修改为 “alipay”
namespace App\Libraries\Alipay;
2.删除不必要的文件
本次操作只是验证应用网关的,咱们先删掉其他文件。
源文件截图
这边只保留
aop
img
log
config.php
function.inc.php
Gateway.php
HttpRequst.php
这些就够了
3.配置confi.php 文件
将之前秘钥都填入文件内,签名方式咱们这边选择“RSA2”
这边强调一点,不管你之前用工具生成的秘钥对是什么样子的,在填入后,将他们转为一行的字符串,不然会报错。
注:如果“openssl_sign(): supplied key param cannot be coerced into a private key”,用下面办法
删除下面两个
-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----
然后再转为一行字符串填入config文件内
4.新建获取config配置文件类 GetConfig.php
这里这样写是便于后需要我们和控制器来调用这个配置文件
namespace App\Libraries\Alipay;
class GetConfig
{
public static function appId()
{
include('config.php');
return $config["app_id"];
}
····
}
5.修改HttpRequst.php文件
由于官方demo也有用php到框架,这里将其改为laravel兼容的,并删除原框架内容。
如果有相关文件需要调用HttpRequest类,需要补充传入$res请求参数,这边可以理解为laravel $request.
namespace App\Libraries\Alipay;
class HttpRequest
{
/** sendPostRequst 方法不修改 **/
public static function getRequest($key, $res)
{
$request = null;
$get = $res->all(); //传入所有请求的参数
if (isset ($get [$key]) && !empty ($get [$key])) {
if (get_magic_quotes_gpc()) {
$request = stripslashes($get [$key]);
} else {
$request = $get [$key];
}
}
return $request;
}
}
6.配置Laravel 访问路径
设置路由
Route::any('ali/gateway', 'AliController@Gateway');//支付宝网关
设置无须“VerifyCsrfToken”验证,这个一定要设置,不然会报错
protected $except = [
'ali/*',
];
接下来我们创建对应的控制器 AliController.php
namespace App\Http\Controllers;
use App\Libraries\Alipay\Aop\AopClient;
use App\Libraries\Alipay\HttpRequest;
use App\Libraries\Alipay\GetConfig;
use App\Libraries\Alipay\Gateway;
use Illuminate\Support\Facades\Log;
use Illuminate\Http\Request;
class AliPayController extends Controller
{
public function Gateway(Request $request)
{
$sign = HttpRequest::getRequest("sign", $request);
$sign_type = HttpRequest::getRequest("sign_type", $request);
$biz_content = HttpRequest::getRequest("biz_content", $request);
$service = HttpRequest::getRequest("service", $request);
$charset = HttpRequest::getRequest("charset", $request);
if (empty ($sign) || empty ($sign_type) || empty ($biz_content) || empty ($service) || empty ($charset)) {
Log::info("some parameter is empty!");
return json_encode(["msg"=>"some parameter is empty.","time"=>time()]);
}
// 收到请求,先验证签名
$as = new AopClient();
$as->alipayrsaPublicKey = GetConfig::alipayPublicKey();
$sign_verify = $as->rsaCheckV2($_REQUEST, GetConfig::alipayPublicKey(), GetConfig::signType());
if (!$sign_verify) {
// 如果验证网关时,请求参数签名失败,则按照标准格式返回,方便在服务窗后台查看。
if (HttpRequest::getRequest("service", $request) == "alipay.service.check") {
$gw = new Gateway ();
$gw->verifygw(false, $request);
return json_encode(["msg"=>"sign verfiy success.","time"=>time()]);
} else {
return json_encode(["msg"=>"sign verfiy fail.","time"=>time()]);
}
}
// 验证网关请求
if (HttpRequest::getRequest("service", $request) == "alipay.service.check") {
$gw = new Gateway ();
$gw->verifygw(true, $request);
}
}
}
7.修改Gateway.php文件
这里删除大部分没用的代码,保留了相关的业务逻辑代码
namespace App\Libraries\Alipay;
use App\Libraries\Alipay\Aop\AopClient;
header("Content-type: text/html; charset=gbk");
class Gateway
{
public function verifygw($is_sign_success,$res)
{
include('config.php');
include('function.inc.php');
$biz_content = HttpRequest::getRequest("biz_content",$res);
$disableLibxmlEntityLoader = libxml_disable_entity_loader(true);
$xml = simplexml_load_string($biz_content);
libxml_disable_entity_loader($disableLibxmlEntityLoader);
$EventType = ( string )$xml->EventType;
if ($EventType == "verifygw") {
$as = new AopClient();
$as->rsaPrivateKey = $config['merchant_private_key'];
if ($is_sign_success) {
$response_xml = "true" . $config ['merchant_public_key'] . "";
} else {
$response_xml = "falseVERIFY_FAILED" . $config ['merchant_public_key'] . "";
}
$mysign = $as->alonersaSign($response_xml, $config['merchant_private_key'], $config['sign_type']);
$return_xml = "" . $response_xml . "" . $mysign . "" . $config['sign_type'] . "";
writeLog("response_xml: " . $return_xml);
echo $return_xml;
exit ();
}
}
}
最后测试,验证
a.提醒如果在demo包内调用文件使用include()即可。
b.部分引用的文件需要加入namespace不要引用会报错!
声明:原创文章,谢绝转载!!