支付宝生活号 php,关于PHP框架Laravel怎么配置支付宝生活号应用网关呢?

支付宝生活号(原服务窗)应用网关配置

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/

c39904b37cc0e7e125c2cb8253251b48.png

上图秘钥需要到生活号后台配置下,并获取支付宝公钥备用

下载支付宝官方demo

目前官网有提供完整的demo,下载地址:https://docs.open.alipay.com/54/104507/

导入Laravel框架内

1.新建资源目录,已建可忽略

app目录下新建“Libaries”目录用来存放相关文件,并将demo包解压到这个目录

源文件夹“ServiceWindow_Demo_php” 修改为 “alipay”

namespace App\Libraries\Alipay;

2.删除不必要的文件

本次操作只是验证应用网关的,咱们先删掉其他文件。

源文件截图

2cc6783ddeb933a8c3716abb77e74a99.png

这边只保留

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 ();

}

}

}

最后测试,验证

4e4fe34f89fbb92df8b5b90ce7158265.png

a.提醒如果在demo包内调用文件使用include()即可。

b.部分引用的文件需要加入namespace不要引用会报错!

声明:原创文章,谢绝转载!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值