文档教程模拟:
http://www.023xs.cn/Article/37/laravel5%E9%9B%86%E6%88%90%E6%94%AF%E4%BB%98%E5%AE%9Dalipay%E6%89%AB%E7%A0%81%E6%94%AF%E4%BB%98%E6%B5%81%E7%A8%8B%EF%BC%88Laravel%E6%94%AF%E4%BB%98%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%89
1、在对应的蚂蚁金服,申请【网页&移动应用】,将对应的应用上线,并签约【电脑网站支付】和【手机网站支付】
2、在项目中composer对应的包【项目里面的vendor/latrell包上传coding的话,需要复制本地后在上传】
3、按照文档修改对应的配置文件,其中各个支付的回调可以单独配置
4、生成对应的地址后,将地址使用二维码生成工具 生成二维码图片 返回即可
示例代码:
订单生成,提交订单代码示例:
public function ccsppUserDoVipOrderAlyPc(Request $request)
{
$data = $request->all();
$userId = $data[\'user_id\'];
$user = \DB::table(\'user\')
->where(\'id\',$userId)
->first();
//此处订单和支付一起生成
$money = 0.01;
$order[\'order_uid\'] = $data[\'user_id\'];
$order[\'order_uname\'] = $user->user_name;
$order[\'order_type\'] = 1;
$order[\'order_time\'] = time();
$order[\'order_money\'] = $money;
$order[\'order_status\'] = 1;
$order[\'order_tel\'] = $user->user_tel;
$order[\'order_sid\'] = str_random(4) .time();
\DB::beginTransaction();
// 创建订单
$res_order = \DB::table(\'order\')
->insertGetId($order);
if(!$res_order){
\DB::rollback();
\DB::commit();
return [\'code\' => 1002, \'data\' => [\'message\' => \'订单生成失败!\']];
}
//生成支付宝的订单
$config = config(\'latrell-alipay-web\');
$alipay = app(\'alipay.web\');
$alipay->setOutTradeNo($order[\'order_sid\']);
$alipay->setTotalFee($order[\'order_money\']);
$alipay->setSubject(\'交易内容\');
$alipay->setBody(\'交易内容\');
$alipay->setNotifyUrl($config[\'notifyUrlJkAly\']);//设置回调地址
$alipay->setQrPayMode(\'1\'); //该设置为可选1-5,添加该参数设置,支持二维码支付。
$basePath = base_path();
$basePath = $basePath."/public/uploads/code/";
$img_file = $basePath.\'aly\'.$order[\'order_sid\'].\'.png\';
$alcode = \'aly\'.$order[\'order_sid\'].\'.png\';
$alycode = self::urlUsePic . $alcode;
$abc = \QrCode::format(\'png\')->size(200)->margin(0)->generate($alipay->getPayLink(),$img_file);
// 跳转到支付页面。
$aliPayUrl = $alipay->getPayLink();
//订单生成后给订单生成对应的支付二维码
\DB::commit();
return [\'code\' => 1000,\'alycode\' => $alycode];
}
回调配置代码示例:
latrell-alipay:
return [
//合作身份者id,以2088开头的16位纯数字。
\'partner_id\' => \'208****12752\',
//卖家支付宝帐户。
\'seller_id\' => \'g******l@da****.com\'
];
latrell-alipay-web:
return [
// 安全检验码,以数字和字母组成的32位字符。
\'key\' => \'bbpjx64******ggve61\',
//签名方式
\'sign_type\' => \'MD5\',
// 服务器异步通知页面路径。支付1的回调
\'notify_url\' => \'https://test/notify_url\',
// 服务器异步通知页面路径。支付2的回调
\'notifyUrlJkAly\' => \'https://test/notifyUrlJkAly\',
// 服务器异步通知页面路径。支付3的回调
\'notifyUrlVideoAly\' => \'https://test/notifyUrlVideoAly\',
// 服务器异步通知页面路径。支付4的回调(在订单生成时选择参数)
\'notifyUrlMeetingAly\' => \'https://test/notifyUrlMeetingAly\',
// 页面跳转同步通知页面路径。
// \'return_url\' => \'https://test/aliPayReturn\'
\'return_url\' => \'\'
];
回调路由单个代码示例:
官方示例:1
public function notify_url(Request $request)
{
// 验证请求。
if (!app(\'alipay.web\')->verify()) {
Log::notice(\'Alipay notify post data verification fail.\', [
\'data\' => $request->instance()->getContent()
]);
return \'fail\';
}
// 判断通知类型。
switch ($request ->input(\'trade_status\',\'\')) {
case \'TRADE_SUCCESS\':
case \'TRADE_FINISHED\':
// TODO: 支付成功,取得订单号进行其它相关操作。
Log::debug(\'Alipay notify post data verification success.\', [
\'out_trade_no\' => $request -> input(\'out_trade_no\',\'\'),
\'trade_no\' => $request -> input(\'trade_no\',\'\')
]);
break;
}
$data = $request->all();
$time_now = time();
\DB::table(\'test\')->where(\'id\',1)->update([\'name\'=>$data[\'out_trade_no\'],\'time\' => $time_now]);
return "success";
}
自己示例:2 已验证,可以使用
public function notifyUrlJkAly(Request $request)
{
$data = $request->all();
$order_sid = $data[\'out_trade_no\'];
$time_now = time();
//修改订单用户和状态
\DB::table(\'order\')->where(\'order_sid\',$order_sid)->update([\'order_status\'=>2,\'order_ptime\' => $time_now]);
//同时根据订单的类型修改用户的会员类型和 版本到期时间 默认加一年
$order_res = \DB::table(\'order\')->where(\'order_sid\',$order_sid)->first();
if($order_res){
//如果是版本支付订单,就修改用户的支付状态,和版本使用期限
$uid = $order_res->order_uid;
$date = date(\'Y\',$time_now) + 1 . \'-\' . date(\'m-d H:i:s\');//一年后日期
$ytime = strtotime($date);
$ress = \DB::table(\'user\')->where(\'id\',$uid)->update([\'user_type\' => 2,\'user_btime\' => $time_now,\'user_etime\' => $ytime]);
}
return "success";
}
注:支付宝退款 时会访问 调用支付成功回调时的接口,所以会产生 数据库订单状态 修改不了的现象,处理办法是在 支付成功回调中 对订单进行状态判断,只有未支付的状态才可以修改订单为支付状态
并且在回调中,处理完后要按照文档上的 返回"success" ,不能自己胡乱写
例如:
/**
* 购买会议活动报名回调 支付宝 url()
* param ()
*/
public function notifyUrlMeetingAly(Request $request)
{
$data = $request->all();
$order_sid = $data[\'out_trade_no\'];
$time_now = time();
//修改订单支付状态
$order = \DB::table(\'order\')->where(\'order_sid\',$order_sid)->first();
$order_status = $order->order_status;
if($order_status == 1){
\DB::table(\'order\')->where(\'order_sid\',$order_sid)->update([\'order_status\'=>2,\'order_ptime\' => $time_now]);
//修改用户报名关系表订单状态
\DB::table(\'morder\')->where(\'morder_sid\',$order_sid)->update([\'morder_status\'=>1]);
}
return \'success\';
}