很多情况下,出于开发目的,没有真正的支付宝商家进行支付宝支付测试。 这时候支付宝沙盒模式的沙盒账户就可以完美的解决这个问题,让我们拥有自己的账户。 为了测试支付功能,当我们需要上线Live站点时,我们只需要更改账户即可。
可以理解为,沙盒账号是为了开发而存在的,除了支付网关之外,与公众账号没有任何区别。
支付套餐我们推荐/pay,可以同时打包主流的支付宝支付和微信支付。
下面是具体实现。
① 使用支付宝账户登录蚂蚁金服开发平台 蚂蚁金服开放平台
② 进入沙箱环境
在正式开始之前,我们需要先弄清楚支付宝是如何完成支付的。
所以我们需要三个请求才能完成付款。 示例如下“我正在使用该框架,其他框架类似”:
// 支付宝支付 Route::group([ 'prefix' => 'alipay','namespace' => 'Alipay' ], function () { Route::get("alipay",'AlipayController@index')->name('alipay'); // 支付宝支付页面 Route::get("return_url",'AlipayController@alipayReturnUrl'); // 前端支付宝回调页面 Route::post("notify_url",'AlipayController@alipayNotify'); // 支付宝回调页面「 用于验证业务逻辑,如商户本身 app_id 」 });
③ 控制器中具体业务逻辑示例如下:
php /** * Created by PhpStorm. * User: nwei * Date: 2018/7/3 * Time: 11:14 * * .--, .--, * ( ( \.---./ ) ) * '.__/o o\__.' * {= ^ =} * > - < * / \ * // \\ * //| . |\\ * "'\ /'"_.-~^`'-. * \ _ /--' ` * ___)( )(___ * (((__) (__))) 高山仰止,景行行止.虽不能至,心向往之. * */ namespace App\Http\Controllers\Alipay; use App\Http\Controllers\BaseController; use Illuminate\Support\Facades\Cache; use Yansongda\Pay\Pay; class AlipayController extends BaseController { protected $config = [ 'app_id' => 'xxxx', 'notify_url' => 'http://xxxx.cn/alipay/notify_url', //支付宝回调页面 'return_url' => 'http://xxxx.cn/alipay/return_url', // 支付成功前端页面跳转 'ali_public_key' => 'xxxxx', // 加密方式: **RSA2** 'private_key' => 'xxxxxxxx', 'log' => [ // optional 'file' => './logs/alipay.log', 'level' => 'debug' ], 'mode' => 'dev', // optional,设置此参数,将进入沙箱模式 ]; /** * 支付页面 * @return \Yansongda\Pay\Gateways\Alipay\WebGateway */ public function index() { Cache::put(['test' => 'laravel-dev'],30); $order = [ 'out_trade_no' => time(), 'total_amount' => '0.01', 'subject' => 'test subject - 测试', ]; $alipay = Pay::alipay($this->config)->web($order); return $alipay;// laravel 框架中请直接 `return $alipay` } /** * 支付完成后前端跳转页面 */ public function alipayReturnUrl() { try{ $data = Pay::alipay($this->config)->verify(); // 是的,验签就这么简单! // 订单号:$data->out_trade_no // 支付宝交易号:$data->trade_no // 订单总金额:$data->total_amount Cache::put(['return_url' => $data],30); return view('alipay_return'); }catch (\Exception $exception){ Cache::put(['return_err' => $exception->getMessage()],10); } } /** * 支付完成后回调 * @return $this */ public function alipayNotify() { Cache::put(['notify_url' => "notify_url"],30); $alipay = Pay::alipay($this->config); try{ $data = $alipay->verify(); // 是的,验签就这么简单! // 请自行对 trade_status 进行判断及其它逻辑进行判断,在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,支付宝才会认定为买家付款成功。 // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号; // 2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额); // 3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email); // 4、验证app_id是否为该商户本身。 // 5、其它业务逻辑情况 // Log::debug('Alipay notify', $data->all()); Cache::put(['alipay_notify' => $data->all()],30); } catch (\Exception $e) { Cache::put(['alipay_err' => $e->getMessage()],10); } // return $alipay->success();// laravel 框架中请直接 `return $alipay->success()` } }
公钥和私钥的生成规则请参考/291/
注意,是由签名验证工具生成的,但公钥是支付宝的公钥。 签名验证工具生成的是应用程序公钥和应用程序私钥。 应用程序公钥和支付宝公钥不是一回事。 我们使用签名验证工具生成下面填写的应用公钥。 保存后会自动生成支付宝公钥。 在我们的配置中,使用的是支付宝公钥。

④ 应用网关配置
应用网关就是你的域名信息。 授权回调是POST方法,是支付宝服务器的回调,用于验证业务逻辑,比如商家本身。 这里的配置信息与中的$信息相同。
上面配置了支付信息。 现在我们进入请求付款页面,如下图:
我正在使用的环境,我的支付页面请求:://会自动跳转到支付宝的在线支付页面,类似://auth.htm?=.00
对于沙盒环境下的支付,我们需要下载并安装沙盒支付宝
支付完成后,会转至类似前端支付完成页面
我写了支付宝服务器的回调信息,如下:
至此,支付功能就大致完成了。
这不是一篇文章,希望大家能给我一些建议。