在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' => '退款失败!']];
}
}
posted @ 2018-08-08 14:56  LvFish  阅读(1338)  评论(0编辑  收藏  举报