在laravel中使用支付宝手机网站支付 和 支付宝退款
1、在蚂蚁金服开放平台中申请对应的应用,并根据提示进行签约
2、给对应的应用信息 生成私钥和公钥(私钥会保存在本地,公钥会放在对应的应用信息中)
3、下载手机网站支付 对应的php sdk
4、将sdk放置在项目app下 ,我将对应sdk文件夹更名为alipayWapPay
5、引入sdk类比如:
require_once app_path('Library') . '/alipayWapPay/wappay/service/AlipayTradeService.php';
require_once app_path('Library') . '/alipayWapPay/wappay/buildermodel/AlipayTradeWapPayContentBuilder.php';
require_once app_path('Library') . '/alipayWapPay/wappay/./../config.php';
use AlipayTradeWapPayContentBuilder;
use AlipayTradeService;
//其中的config.php这样用是没用的,下面的config我在项目中使用了laravel的config机制
6、设置路由
public function aliWapPayTest(Request $request)
{
$data = $request->all();
// dd($data);
// $out_trade_no = getTradeNOString(); //公共方法生成唯一订单号
$out_trade_no = 'abc123456'; //公共方法生成唯一订单号
$subject = '预约'; //数据仅供测试,下同
$total_amount = 0.01;
$body = 'test test!';
$timeout_express="1m"; $payRequestBuilder = new AlipayTradeWapPayContentBuilder();
$payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setTimeExpress($timeout_express); $config = array (
//应用ID,您的APPID。
'app_id' => "", //商户私钥,您的原始格式RSA私钥
'merchant_private_key' => "",
//异步通知地址
'notify_url' => "https://test/aliWapPayNotify", //同步跳转
'return_url' => "http://mitsein.com/alipay.trade.wap.pay-PHP-UTF-8/return_url.php", //编码格式
'charset' => "UTF-8", //签名方式
'sign_type'=>"RSA2", //支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do", //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "", );
$payResponse = new AlipayTradeService($config); $result=$payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);
}
7、手机网页访问对应路由后会自动识别比并提示打开支付宝app,进行支付即可
在dxjk项目中使用示例:
public function userOrderAlipayEditionMobile(Request $request)
{
$data = $request->all();
//金钱特殊处理,通过后台查询取得
$res_order = \DB::table('order')
->where('order_id',$data['order_id'])
->first();
// dd($res_order);
$order_sid = $res_order->order_sid;
$money = $res_order->order_money;
$config = config('alywappayconf.alyconf');
$out_trade_no = $order_sid;
$subject = '会员版本'; //数据仅供测试,下同
$total_amount = $money;
$body = '会员版本!';
$timeout_express="1m"; $payRequestBuilder = new AlipayTradeWapPayContentBuilder();
$payRequestBuilder->setBody($body); $payRequestBuilder->setSubject($subject);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$payRequestBuilder->setTotalAmount($total_amount); $payRequestBuilder->setTimeExpress($timeout_express); $payResponse = new AlipayTradeService($config); // 'return_url' => "http://danxigu.com/m_web",
$return_url = $config['returnEdition_url'] ."?id=".$data['order_id'];
$result=$payResponse->wapPay($payRequestBuilder,$return_url,$config['notifyEdition_url']); }
注:wapPay();中三个参数的意义 第一个是支付对象,第二个是回调页面,第三个是回调url[用于处理支付后的 业务逻辑 下面会给出示例];(其中这后两个参数是在config数组中,是灵活可变的,用于不同支付的回调)
alywappayconf.php 内容和解释如下
return [
/*
* Debug 模式,bool 值:true/false
*
* 当值为 false 时,所有的日志都不会记录
*/
'alyconf' => array (
//应用ID,您的APPID。
'app_id' => "2010720", //商户私钥,您的原始格式RSA私钥
'merchant_private_key' => "WnAgMBAAECggfHnvhZlWdmrEBSsTxEZ5duHRiQh7iaQjbOKyC3T/B9", //异步通知地址
'notify_url' => "https://test.test.com/aliWapPayNotify", //用户版本选择的异步通知地址
'notifyEdition_url' => "https://test.test.com/notifyAliEdition", //购买会议活动报名回调 支付宝 url()
'notifyUrlMeetingAly' => "https://test.test.com/notifyUrlMeetingAly", //成为会员回调 支付宝 url()
'notifyUrlJkAly' => "https://test.test.com/notifyUrlJkAly", //同步跳转
'return_url' => "http://test.test.com/m_html", //同步跳转
'returnEdition_url' => "http://test.test.com/m_html", //编码格式
'charset' => "UTF-8", //签名方式
'sign_type'=>"RSA2", //支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do", //支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "MII747Jh2mgtehXerPq0lpbQeT5YGqb6KQmN8A1pwIDAQAB", )
]; 三、支付回调接口逻辑处理示例: laravel controller 示例:
/**
* 成为会员回调 支付宝 url()
* param ()
*/
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 true;
}
注:支付都是使用的订单编号"out_trade_no"参数进行逻辑处理 四:支付宝统一退款操作,理论上只要有out_trade_no即商户自己生产的sid就可以退款
注:退款时 会调用支付的回调接口,所以在支付成功的回调接口中要对订单状态进行判断 ,避免修改不了数据库订单的尴尬
范文引用示例:
https://blog.csdn.net/denglinqingqinyuzhao/article/details/77947690
1、引入上面所说的手机网站支付php的sdk
2、引入退款所需要的php类并use
require_once app_path('Library') . '/alipayWapPay/aop/AopClient.php';
require_once app_path('Library') . '/alipayWapPay/aop/request/AlipayTradeAppPayRequest.php';
require_once app_path('Library') . '/alipayWapPay/aop/request/AlipayTradeRefundRequest.php';
use Config;
use AopClient;
use AlipayTradeRefundRequest;
3、public function refundAlyTest(Request $r)
{
$aop = new AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = '******';//app_id
$aop->rsaPrivateKey = '*******';//请填写开发者私钥去头去尾去回车,一行字符串
$aop->alipayrsaPublicKey='*******';//请填写支付宝公钥,一行字符串
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='UTF-8';
$aop->format='json';
$request = new AlipayTradeRefundRequest ();
$out_trade_no = 'Dg1d1551072870';
$bizcontent = json_encode(
[
'out_trade_no' => $out_trade_no,
'trade_no' => '',
'refund_amount' => 0.01,
'refund_reason' => '正常退款', ]
); $request->setBizContent($bizcontent);
$result = $aop->execute ( $request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
$sid = $result->$responseNode->out_trade_no;
//订单退款逻辑处理 可以对数据库进行修改
return ['code' => 1000, 'data' => ['message' => '退款成功!']];
} else {
return ['code' => 1001, 'data' => ['message' => '退款失败!']];
}
}
在laravel中使用支付宝手机网站支付 和 支付宝退款的更多相关文章
- Laravel5.5 支付宝手机网站支付的教程
https://segmentfault.com/a/1190000015559571 这篇文章主要介绍了Laravel5.5 支付宝手机网站支付的教程,小编觉得挺不错的,现在分享给大家,也给大家做个 ...
- 自己动手搞定支付宝手机网站支付接口 FOR ECShop
支付宝WAP网站版本的支付接口网上整合的比较少,看到很多网站在卖,顿觉无语. 主要是得自己查看支付宝官方提供的SDK中的开发文档. 支付宝sdk下载地址:https://doc.open.alipay ...
- PHP支付宝手机网站支付功能
1.开通支付宝商家中心里面的手机网站支付 2.再去开放平台-开发者中心-创建移动支付的应用-获取到APPID 3.接着去文档中心下载DEMO 其实demo很简单.如果第一次看的话会存在看不懂的状态. ...
- 支付宝手机网站支付流程(Node实现)
前言 公司M站要接入支付宝,借机研究了一下支付宝的支付流程.毕竟,只有公司才能拿到支付接口权限. 主要参考文档: https://doc.open.alipay.com/doc2/detail?tre ...
- Asp.Net支付宝手机网站支付接口API之C#版
一.准备工作 1.使用企业支付宝签约手机网站支付 2.下载支付宝官方demo 文档地址:https://doc.open.alipay.com/doc2/detail?treeId=60&ar ...
- tp3.2 支付宝手机网站支付
手机网站支付接口,支付宝官方文档:https://b.alipay.com/signing/productSet.htm?navKey=all 第一步: 1)登陆支付宝企业账号 进入支付宝官网 ,登陆 ...
- 支付宝手机网站支付(基于Java实现支付宝手机网站支付)
支付宝支付核心需要的参数是(APPID,PRIVATE_KEY,ALIPAY_PUBLIC_KEY) APPID:创建应用后就有的APPID. PRIVATE_KEY:应用私钥 ALIPAY_PUBL ...
- 支付宝开发之手机网站支付(H5支付)
其实官方的文档中:https://docs.open.alipay.com/203 介绍的已经很详细了,我就实地的看文档操作了一遍,具体步骤如下: 一.创建应用 流程如下: 首先要有支付宝开放平台: ...
- 手机网站支付如何接入支付宝简易版支付功能PHP版
接入支付宝准备工作:(关于账号可以是个体商户也可以是企业账号但必须有营业执照) 1.登录蚂蚁金服开放平台 2.创建应用,应用分类网页应用和移动应用.应用提交审核审核通过后得到Appid才能调用相应的 ...
随机推荐
- 4.微信小程序-B站:先把首页造出来
(小安娜:失踪人口已上线,大家快来喷喷喷他!),sorry++,最近身边发生太多事情,导致这最关键的实战开篇都未写,(小安娜-分身1:懒就是懒,不负责任,我之前学的都忘了),(小安娜-分身2:上一篇双 ...
- thinkphp Composer安装指南
1.首先我们去composer的官网下载composer,当然也可以用命令行的形势下下载,我是在windows安装的.https://www.phpcomposer.com/ 2.下载以后进行安装,一 ...
- Rotate Image,N*N矩阵顺时针旋转90度
public class RotateImage { public void rotate(int[][] matrix) { if(matrix.length == 1 && mat ...
- Pandas数据结构
Pandas处理以下三个数据结构 - 系列(Series) 数据帧(DataFrame) 面板(Panel) 这些数据结构构建在Numpy数组之上,这意味着它们很快. 维数和描述 考虑这些数据结构的最 ...
- Java多线程 - Callable和Future
已知的创建多线程的方法有继承Tread类和实现Runnable方法.此外Java还提供了Callable接口,Callable接口也提供了一个call()方法来做为线程执行体.但是call()方法与r ...
- Spring中Bean的生命周期是怎样的
1.Spring对Bean进行实例化(相当于程序中的new Xx()) 2.Spring将值和Bean的引用注入进Bean对应的属性中 3.如果Bean实现了BeanNameAware接口,Sprin ...
- python学习笔记(virtualenv下载安装)
之前博客评论中有人建议我面对多个python版本的情况.可以使用virtualenv这个python虚拟沙盒 首页是利用pip下载.关于pip如何下载安装前面的博客中已经提到就不细说 cmd直接进入p ...
- Android报错Type Error executing aapt: Return code -1 - HTTP 500
我的做法是(乱蒙对的) 把menu.xml干掉!,对的你没看错! 当然其他人方案:如下 1.http://stackoverflow.com/questions/10699439/aapt-filin ...
- eclipse导入android项目错误,项目名称上有红叉,但代码中无报错
首先,在项目上右键,属性,选择编译目标,选择android版本或把Android的版本调高一点.
- combobox默认值为第一个数据,修改为空值
以前用combobox的时候默认是空的,可是昨天不知道为什么,默认的居然为第一个数据,实在让人烦恼.百度了很多,有些人说默认本来就是为空的,而有些也和我一样默认是第一个数据. 我想造成这个现象的原因应 ...