alipay
基于Laravel框架的支付宝支付SDK,目前仅支持当面付
Installation
$ composer require "kaylyu/alipay:~1.0" -vvv
Usage
<?php
use Faker\Factory;
use Kaylyu\Alipay\F2fpay\Application;
use Kaylyu\Alipay\F2fpay\Base\Model\Builder\AlipayTradePayContentBuilder;
use Kaylyu\Alipay\F2fpay\Base\Model\Builder\AlipayTradePrecreateContentBuilder;
use Kaylyu\Alipay\F2fpay\Base\Model\Builder\AlipayTradeQueryContentBuilder;
use Kaylyu\Alipay\F2fpay\Base\Model\Builder\ExtendParams;
use Kaylyu\Alipay\F2fpay\Base\Model\Builder\GoodsDetail;
class Client
{
protected $application;
protected function setUp()/* The :void return type declaration that should be here would cause a BC issue */
{
$this->application = new Application(
[
'response_type' => 'collection',//collection array json object
'log' => [
'file' => __DIR__ . '/logs/kaylu-alipay.log',
'level' => 'debug',
],
'http' => [
'timeout' => 30,
],
//当面付
'f2fpay' => [
//签名方式,默认为RSA2(RSA2048)
'sign_type' => "RSA2",
//支付宝公钥
'alipay_public_key' => "",
//商户私钥
'merchant_private_key' => "",
//编码格式
'charset' => "UTF-8",
//支付宝网关
'gateway_url' => "https://openapi.alipaydev.com/gateway.do",
//应用ID
'app_id' => "",
//异步通知地址,只有扫码支付预下单可用
'notify_url' => "http://www.baidu.com",
]
]
);
}
/**
* 统一收单线下交易预创建(扫码支付)
* @author kaylv <kaylv@dayuw.com>
*/
public function QrPay()
{
$faker = Factory::create();
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
//$outTradeNo = "qrpay".date('Ymdhis').mt_rand(100,1000);
$outTradeNo = $faker->bankAccountNumber;
// (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”
$subject = $faker->name;
// (必填) 订单总金额,单位为元,不能超过1亿元
// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
$totalAmount = $faker->numberBetween(1,100);
// (不推荐使用) 订单可打折金额,可以配合商家平台配置折扣活动,如果订单部分商品参与打折,可以将部分商品总价填写至此字段,默认全部商品可打折
// 如果该值未传入,但传入了【订单总金额】,【不可打折金额】 则该值默认为【订单总金额】- 【不可打折金额】
//String discountableAmount = "1.00"; //
// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
$undiscountableAmount = "0.01";
// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
//$sellerId = "";
// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
$body = "购买商品2件共15.00元";
//商户操作员编号,添加此参数可以为商户操作员做销售统计
$operatorId = "2088102179124175";
// (可选) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
$storeId = "2088102179124175";
// 支付宝的店铺编号
$alipayStoreId= "2088102179124175";
// 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),系统商开发使用,详情请咨询支付宝技术支持
$providerId = ""; //系统商pid,作为系统商返佣数据提取的依据
$extendParams = new ExtendParams();
$extendParams->setSysServiceProviderId($providerId);
$extendParamsArr = $extendParams->getExtendParams();
// 支付超时,线下扫码交易定义为5分钟
$timeExpress = "5m";
// 商品明细列表,需填写购买商品详细信息,
$goodsDetailList = array();
// 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
$goods1 = new GoodsDetail();
$goods1->setGoodsId("apple-01");
$goods1->setGoodsName("iphone");
$goods1->setPrice(3000);
$goods1->setQuantity(1);
//得到商品1明细数组
$goods1Arr = $goods1->getGoodsDetail();
// 继续创建并添加第一条商品信息,用户购买的产品为“xx牙刷”,单价为5.05元,购买了两件
$goods2 = new GoodsDetail();
$goods2->setGoodsId("apple-02");
$goods2->setGoodsName("ipad");
$goods2->setPrice(1000);
$goods2->setQuantity(1);
//得到商品1明细数组
$goods2Arr = $goods2->getGoodsDetail();
$goodsDetailList = array($goods1Arr,$goods2Arr);
//第三方应用授权令牌,商户授权系统商开发模式下使用
$appAuthToken = "";//根据真实值填写
// 创建请求builder,设置请求参数
$qrPayRequestBuilder = new AlipayTradePrecreateContentBuilder();
$qrPayRequestBuilder->setOutTradeNo($outTradeNo);
$qrPayRequestBuilder->setTotalAmount($totalAmount);
$qrPayRequestBuilder->setTimeExpress($timeExpress);
$qrPayRequestBuilder->setSubject($subject);
$qrPayRequestBuilder->setBody($body);
$qrPayRequestBuilder->setUndiscountableAmount($undiscountableAmount);
// $qrPayRequestBuilder->setExtendParams($extendParamsArr);
// $qrPayRequestBuilder->setGoodsDetailList($goodsDetailList);
// $qrPayRequestBuilder->setStoreId($storeId);
// $qrPayRequestBuilder->setOperatorId($operatorId);
// $qrPayRequestBuilder->setAlipayStoreId($alipayStoreId);
$qrPayRequestBuilder->setAppAuthToken($appAuthToken);
$response = $this->application->order->qrPay($qrPayRequestBuilder);
var_dump($response);
var_dump($response->tradeStatus);//此值可以与AlipayF2FPayResult定义的常量进行对比,判断响应数据是否正常
var_dump($response->response);//响应内容
var_dump($response->sign);
}
public function testBarPay(){
$faker = Factory::create();
// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
//$outTradeNo = "barpay" . date('Ymdhis') . mt_rand(100, 1000);
$outTradeNo = $faker->bankAccountNumber;
// (必填) 订单标题,粗略描述用户的支付目的。如“XX品牌XXX门店消费”
$subject = $faker->name;
// (必填) 订单总金额,单位为元,不能超过1亿元
// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】
$totalAmount = $faker->numberBetween(1,100);
// (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
$authCode = '280084845040308775'; //28开头18位数字
// (可选,根据需要使用) 订单可打折金额,可以配合商家平台配置折扣活动,如果订单部分商品参与打折,可以将部分商品总价填写至此字段,默认全部商品可打折
// 如果该值未传入,但传入了【订单总金额】,【不可打折金额】 则该值默认为【订单总金额】- 【不可打折金额】
//String discountableAmount = "1.00"; //
// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段
// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】
$undiscountableAmount = "0.01";
// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)
// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PID
$sellerId = "";
// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"
$body = "购买商品2件共15.00元";
//商户操作员编号,添加此参数可以为商户操作员做销售统计
$operatorId = "test_operator_id";
// (可选) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持
$storeId = "test_store_id";
// 支付宝的店铺编号
$alipayStoreId = "test_alipay_store_id";
// 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持
$providerId = ""; //系统商pid,作为系统商返佣数据提取的依据
$extendParams = new ExtendParams();
$extendParams->setSysServiceProviderId($providerId);
$extendParamsArr = $extendParams->getExtendParams();
// 支付超时,线下扫码交易定义为5分钟
$timeExpress = "5m";
// 商品明细列表,需填写购买商品详细信息,
$goodsDetailList = array();
// 创建一个商品信息,参数含义分别为商品id(使用国标)、名称、单价(单位为分)、数量,如果需要添加商品类别,详见GoodsDetail
$goods1 = new GoodsDetail();
$goods1->setGoodsId("good_id001");
$goods1->setGoodsName("XXX商品1");
$goods1->setPrice(3000);
$goods1->setQuantity(1);
//得到商品1明细数组
$goods1Arr = $goods1->getGoodsDetail();
// 继续创建并添加第一条商品信息,用户购买的产品为“xx牙刷”,单价为5.05元,购买了两件
$goods2 = new GoodsDetail();
$goods2->setGoodsId("good_id002");
$goods2->setGoodsName("XXX商品2");
$goods2->setPrice(1000);
$goods2->setQuantity(1);
//得到商品1明细数组
$goods2Arr = $goods2->getGoodsDetail();
$goodsDetailList = array($goods1Arr, $goods2Arr);
//第三方应用授权令牌,商户授权系统商开发模式下使用
$appAuthToken = "";//根据真实值填写
// 创建请求builder,设置请求参数
$barPayRequestBuilder = new AlipayTradePayContentBuilder();
$barPayRequestBuilder->setOutTradeNo($outTradeNo);
$barPayRequestBuilder->setTotalAmount($totalAmount);
$barPayRequestBuilder->setAuthCode($authCode);
$barPayRequestBuilder->setTimeExpress($timeExpress);
$barPayRequestBuilder->setSubject($subject);
$barPayRequestBuilder->setBody($body);
$barPayRequestBuilder->setUndiscountableAmount($undiscountableAmount);
// $barPayRequestBuilder->setExtendParams($extendParamsArr);
// $barPayRequestBuilder->setGoodsDetailList($goodsDetailList);
// $barPayRequestBuilder->setStoreId($storeId);
// $barPayRequestBuilder->setOperatorId($operatorId);
// $barPayRequestBuilder->setAlipayStoreId($alipayStoreId);
$barPayRequestBuilder->setAppAuthToken($appAuthToken);
//请求
$response = $this->application->order->barPay($barPayRequestBuilder);
var_dump($response);
var_dump($response->tradeStatus);//此值可以与AlipayF2FPayResult定义的常量进行对比,判断响应数据是否正常
var_dump($response->response);
var_dump($response->sign);
}
/**
* 统一收单线下交易查询
* @author kaylv <kaylv@dayuw.com>
*/
public function Query(){
////获取商户订单号
$out_trade_no = '0478795592836';
//第三方应用授权令牌,商户授权系统商开发模式下使用
$appAuthToken = "";//根据真实值填写
//构造查询业务请求参数对象
$queryContentBuilder = new AlipayTradeQueryContentBuilder();
$queryContentBuilder->setOutTradeNo($out_trade_no);
$queryContentBuilder->setAppAuthToken($appAuthToken);
//请求
$response = $this->application->order->query($queryContentBuilder);
var_dump($response);
var_dump($response->tradeStatus);//此值可以与AlipayF2FPayResult定义的常量进行对比,判断响应数据是否正常
var_dump($response->response);
var_dump($response->sign);
}
}