支付宝支付开发――当面付条码支付和扫码支付实例


Posted in PHP onNovember 04, 2016

本文介绍支付宝中当面付下属的条码支付、扫码支付、订单查询、退款申请的集成开发过程。

 本文分为以下五个部分:

  • 条码支付和扫码支付介绍
  • 申请应用
  • 密钥生成及配置
  • API及SDK集成
  • 条码支付、扫码支付、订单查询、退款申请

 一、条码支付及二维码支付介绍

1. 条码支付
条码支付是支付宝给到线下传统行业的一种收款方式。商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款。用户仅需出示付款码,所有收款操作由商家端完成。其使用场景如下:支付宝支付开发――当面付条码支付和扫码支付实例
业务流程:支付宝支付开发――当面付条码支付和扫码支付实例

使用步骤:

  1. 用户登陆支付宝钱包,点击首页“付款”,进入付款码界面;
  2. 收银员在商家收银系统操作生成订单,用户确认支付金额;
  3. 用户出示钱包的“付款码”,收银员用扫码设备来扫描用户手机上的条码/二维码后,商家收银系统提交支付;
  4. 付款成功后商家收银系统会拿到支付成功或者失败的结果。

2. 扫码支付

扫码支付,指用户打开支付宝钱包中的“扫一扫”功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付等场景。

其使用场景如下:支付宝支付开发――当面付条码支付和扫码支付实例
业务流程:支付宝支付开发――当面付条码支付和扫码支付实例

使用步骤:

  1. 用户登陆支付宝钱包,点击首页“付款-扫码付”,进入扫一扫界面;
  2. 收银员在商家收银系统操作生成支付宝订单,用户确认支付金额,并生成二维码;
  3. 用户使用钱包的“扫码付”,扫收银员提供的二维码,确认支付;
  4. 用户付款后商家收银系统会拿到支付成功或者失败的结果。 

二、接口申请

企业在申请企业支付宝之后,进行功能申请并签约,然后在蚂蚁金服开放平台中申请应用如下(详细过程就略了)支付宝支付开发――当面付条码支付和扫码支付实例
然后在功能列表中,申请当面付这一功能,申请成功后如下。支付宝支付开发――当面付条码支付和扫码支付实例
这样,我们就有了当面付的权限了。

三、密钥生成

在支付宝当面付的接口中,使用了非对称加密算法,商户自己的公钥和私钥需要自己使用OpenSSL手动生成。对这些概念比较陌生的话,请先自行先了解一下密码学的相关知识。OpenSSL也可以从方倍工作室博客中找到。

下载支付宝官方提供的密钥生成工具OpenSSL,然后执行以下命令就可以生成公钥和私钥。支付宝支付开发――当面付条码支付和扫码支付实例
其中

genrsa -out rsa_private_key.pem 1024

是用于生成RSA私钥,执行后在程序目录中生成一个文件rsa_private_key.pem,其内容如下

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCyffRONGd8Q/1kRh1cpsSRi360DXLHI7zxdPJGYe5HKDWF7u9b
3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+LiYOyNpd6As3Q427KCTIT7aj
hHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAdzus0WcJiJOxW02rxSQIDAQAB
AoGAXBJYyVaC4zj3Jph8YOStlR5N13bwdATdW/glWWT+0rnNEi90TQHRNvY7lNVN
JgrPrTS182TVgjOPxmwSnebakhIuGIdPq99GLE4LGd5lKWTzkd84BMvhatfNsCCz
cEVFqKg3tZd4t3fQ93FrILsnnZpLhiW53jIrStCkR3rx9OECQQDWMSHyc91hEVMQ
qVNasbGEicKWxhoDqjdm2lHkBx4mrB9JEZFDs6MxWdajf2/Qw+tgtpN3YBcCDw/H
nGHhQtStAkEA1VTyjOdAwWode8X4fu0IPq9+E19mcVOAJjLBH46mropwgOdj3raq
T/ThaKeaydjabsTAiY2J18HiTiyH+1bGjQJBAKgRJXH5OFxSG7uXIbCofYJiFi34
g7EcfxxVcqxaaW4u4N2Uy0c0TXkL5T+lXzeQg8D/gfbJj0QuTVNzgdofdoECQBHY
OznCFk6Xe8PguXqUhT4JG/iu4DjWjT+kuzbSjerHtcVylY4JpZFuoHRKoM4Fj6/4
UUqwRjmABFgZrX4+sfkCQCNI8RCZ6yprh5kEOePo3uazAlNENP8dKkhgqChawdK7
7NzlJ727Nt23STHFx6NkhzyruJGQ5Vx1Lkl0wKuKbXM=
-----END RSA PRIVATE KEY-----

命令

rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

是用于生成RSA公钥,执行后在程序目录中生成一个文件rsa_public_key.pem,其内容如下

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyffRONGd8Q/1kRh1cpsSRi360
DXLHI7zxdPJGYe5HKDWF7u9b3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+
LiYOyNpd6As3Q427KCTIT7ajhHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAd
zus0WcJiJOxW02rxSQIDAQAB
-----END PUBLIC KEY-----

生成的这个RSA公钥,需要填写到应用中去,填写地址如下所示。私钥不需要填到配置中,到时候配置到代码中。支付宝支付开发――当面付条码支付和扫码支付实例
特别注意,密钥要去掉注释部分,且转换成一行字符,否则回车换行也成为密钥的一部分,将导致无法正常加解密。支付宝支付开发――当面付条码支付和扫码支付实例
同时,可以点击 “查看支付宝公钥”,将支付宝的公钥复制保存下来,后面的程序中将需要用到。支付宝支付开发――当面付条码支付和扫码支付实例

四、密钥生成API与密钥配置
公共参数

请求地址:

环境 HTTPS请求地址
正式环境 https://openapi.alipay.com/gateway.do

公共请求参数:

参数 类型 是否必填 最大长度 描述
app_id String 32 支付宝分配给开发者的应用ID
method String 128 接口名称
format String 40 仅支持JSON
charset String 10 请求使用的编码格式,如utf-8,gbk,gb2312等
sign_type String 10 商户生成签名字符串所使用的签名算法类型,目前支持RSA
sign String 256 商户请求参数的签名串,详见签名
timestamp String 19 发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
version String 3 调用的接口版本,固定为:1.0
notify_url String 256 支付宝服务器主动通知商户服务器里指定的页面http/https路径。
app_auth_token String 40 详见应用授权概述
biz_content String - 请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档

请求参数

参数 类型 是否必填 最大长度 描述
out_trade_no String 必须 64 商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
scene String 必须 32 支付场景 条码支付,取值:bar_code 声波支付,取值:wave_code
auth_code String 必须 32 支付授权码
seller_id String 可选 28 如果该值为空,则默认为商户签约账号对应的支付宝用户ID
total_amount Price 可选 11 订单总金额,单位为元,
discountable_amount Price 可选 11 参与优惠计算的金额,单位为元
undiscountable_amount Price 可选 11 不参与优惠计算的金额,单位为元
subject String 必须 256 订单标题
body String 可选 128 订单描述
?goods_detail GoodsDetail [] 可选 - 订单包含的商品列表信息,Json格式,其它说明详见商品明细说明
operator_id String 可选 28 商户操作员编号
store_id String 可选 32 商户门店编号
terminal_id String 可选 32 商户机具终端编号
alipay_store_id String 可选 32 支付宝的店铺编号
?extend_params ExtendParams 可选 - 业务扩展参数
timeout_express String 可选 6 该笔订单允许的最晚付款时间,逾期将关闭交易。
?royalty_info RoyaltyInfo 可选 - 描述分账信息,Json格式,其它说明详见分账说明
?sub_merchant SubMerchant 可选 - 二级商户信息,当前只对特殊银行机构特定场景下使用此字段

公共响应参数

参数 类型 是否必填 最大长度 描述
code String - 网关返回码,详见文档
msg String - 网关返回码描述,详见文档
sub_code String - 业务返回码,详见文档
sub_msg String - 业务返回码描述,详见文档
sign String - 签名,详见文档

响应参数

参数 类型 是否必填 最大长度 描述
trade_no String 必填 64 支付宝交易号
out_trade_no String 必填 64 商户订单号
buyer_logon_id String 必填 100 买家支付宝账号
total_amount Price 必填 11 交易金额
receipt_amount String 必填 11 实收金额
buyer_pay_amount Price 选填 11 买家付款的金额
point_amount Price 选填 11 使用积分宝付款的金额
invoice_amount Price 选填 11 交易中可给用户开具发票的金额
gmt_payment Date 必填 32 交易支付时间
?fund_bill_list TradeFundBill [] 必填 - 交易支付使用的资金渠道
card_balance Price 选填 11 支付宝卡余额
store_name String 选填 512 发生支付交易的商户门店名称
buyer_user_id String 必填 28 买家在支付宝的用户id
discount_goods_detail String 必填 - 本次交易支付所使用的单品券优惠的商品优惠信息

系统中配置如下

<?php
$config = array ( 
 //支付宝公钥
 'alipay_public_key' => "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB",

 //商户私钥
 'merchant_private_key' => "MIICXAIBAAKBgQCyffRONGd8Q/1kRh1cpsSRi360DXLHI7zxdPJGYe5HKDWF7u9b3zZU9erZpM90XE7gZRKsxIgOurH4uqhmVRbto3e+LiYOyNpd6As3Q427KCTIT7ajhHicZ6GWhegTUiVLqiuWLsauQcbI6DO4GEZrlvAdzus0WcJiJOxW02rxSQIDAQABAoGAXBJYyVaC4zj3Jph8YOStlR5N13bwdATdW/glWWT+0rnNEi90TQHRNvY7lNVNJgrPrTS182TVgjOPxmwSnebakhIuGIdPq99GLE4LGd5lKWTzkd84BMvhatfNsCCzcEVFqKg3tZd4t3fQ93FrILsnnZpLhiW53jIrStCkR3rx9OECQQDWMSHyc91hEVMQqVNasbGEicKWxhoDqjdm2lHkBx4mrB9JEZFDs6MxWdajf2/Qw+tgtpN3YBcCDw/HnGHhQtStAkEA1VTyjOdAwWode8X4fu0IPq9+E19mcVOAJjLBH46mropwgOdj3raqT/ThaKeaydjabsTAiY2J18HiTiyH+1bGjQJBAKgRJXH5OFxSG7uXIbCofYJiFi34g7EcfxxVcqxaaW4u4N2Uy0c0TXkL5T+lXzeQg8D/gfbJj0QuTVNzgdofdoECQBHYOznCFk6Xe8PguXqUhT4JG/iu4DjWjT+kuzbSjerHtcVylY4JpZFuoHRKoM4Fj6/4UUqwRjmABFgZrX4+sfkCQCNI8RCZ6yprh5kEOePo3uazAlNENP8dKkhgqChawdK77NzlJ727Nt23STHFx6NkhzyruJGQ5Vx1Lkl0wKuKbXM=",

 //编码格式
 'charset' => "UTF-8",

 //支付宝网关
 'gatewayUrl' => "https://openapi.alipay.com/gateway.do",

 //应用ID
 'app_id' => "2016061501500000",

 //异步通知地址,只有扫码支付预下单可用
 'notify_url' => "http://www.fangbei.org/alipay/notify.html",

 //最大查询重试次数
 'MaxQueryRetry' => "10",

 //查询间隔
 'QueryDuration' => "3"
);

其中支付宝公钥就是在前面中复制保存的,直接复制到程序中即可,而商户私钥是之前OpenSSL中生成的私钥。APPID是该服务的id号。

而这个异步通知将会接收扫码支付结果的通知。

五、条码支付、扫码支付、订单查询、退款申请

1. 条码支付

条码支付的参数配置如下

// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
$outTradeNo = "barpay" . date('Ymdhis') . mt_rand(100, 1000);
$subject = "方倍工作室-支付宝-当面付-扫码支付";
$totalAmount = 0.01; // (必填) 订单总金额,单位为元,不能超过1亿元

// (必填) 付款条码,用户支付宝钱包手机app点击“付款”产生的付款条码
$authCode = $_POST['auth_code']; //28开头18位数字

// 支付超时,线下扫码交易定义为5分钟
$timeExpress = "5m";

// 创建请求builder,设置请求参数
$barPayRequestBuilder = new AlipayTradePayContentBuilder();
$barPayRequestBuilder->setOutTradeNo($outTradeNo);
$barPayRequestBuilder->setTotalAmount($totalAmount);
$barPayRequestBuilder->setAuthCode($authCode);
$barPayRequestBuilder->setTimeExpress($timeExpress);
$barPayRequestBuilder->setSubject($subject);
// 调用barPay方法获取当面付应答
$barPay = new AlipayTradeService($config);
$barPayResult = $barPay->barPay($barPayRequestBuilder);

switch ($barPayResult->getTradeStatus()) {
 case "SUCCESS":
  echo "支付宝支付成功:" . "<br>--------------------------<br>";
  print_r($barPayResult->getResponse());
  break;
 case "FAILED":
  echo "支付宝支付失败!!!" . "<br>--------------------------<br>";
  if (!empty($barPayResult->getResponse())) {
   print_r($barPayResult->getResponse());
  }
  break;
 case "UNKNOWN":
  echo "系统异常,订单状态未知!!!" . "<br>--------------------------<br>";
  if (!empty($barPayResult->getResponse())) {
   print_r($barPayResult->getResponse());
  }
  break;
 default:
  echo "不支持的交易状态,交易返回异常!!!";
  break;
}
 return;
}

程序监测,最终提交的url如下

https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.pay×tamp=2016-08-26+17%3A14%3A52&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=&charset=UTF-8&app_auth_token=&sign=EMVoBAhPkW6B1m%2BoXytdbUpIxnIAq73jtiPhlH2VUYy4OcJQ2UiVTXWttw0y%2B7UEXHWILY8fYRDoNrJWSjBATrAqbGCLpPc4YBQSwtPCb%2F76d65dMQEyrEnk2sgcqhxCiJNKRoQjgAQmBQdHneerU7SwSNJ%2FfF%2F025yltZk5lzQ%3D

发送的json数据如下:

{
 "scene":"bar_code",
 "out_trade_no":"barpay20160826051452680",
 "total_amount":0.01,
 "auth_code":"289743098358423535",
 "timeout_express":"5m",
 "subject":"方倍工作室-支付宝-当面付-扫码支付"
}

接收到的数据如下

{
 "alipay_trade_pay_response":{
  "code":"10000",
  "msg":"Success",
  "buyer_logon_id":"118***@qq.com",
  "buyer_pay_amount":"0.01",
  "buyer_user_id":"2088002364008751",
  "fund_bill_list":[
   {
    "amount":"0.01",
    "fund_channel":"ALIPAYACCOUNT"
   }
  ],
  "gmt_payment":"2016-08-26 17:14:59",
  "invoice_amount":"0.01",
  "open_id":"20880044751374809757987911112575",
  "out_trade_no":"barpay20160826051452680",
  "point_amount":"0.00",
  "receipt_amount":"0.01",
  "total_amount":"0.01",
  "trade_no":"2016082621001004750244100034"
 },
 "sign":"pEDeMwh6x73t9LmWrZpGnVb1npnKtODw6+8MDUTurNPVWXR1JHT+x3cRt2G4SDNHzxkJTzSpUXjNylsWisRTnQJJzqRP5XMujxmaAHP/d5xXeyWasDag5Cj7yGD7t80buDAsdE4eoqQ6ox7KzJ6LwKcphOX13tI+Ukt1dGCQS5o="
}

2. 扫码支付
扫码支付的参数配置如下

// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,
// 需保证商户系统端不能重复,建议通过数据库sequence生成,
$outTradeNo = "qrpay".date('Ymdhis').mt_rand(100,1000);
$subject = "方倍工作室-支付宝-当面付-扫码支付";
$totalAmount = "0.01";

// 支付超时,线下扫码交易定义为5分钟
$timeExpress = "5m";

// 创建请求builder,设置请求参数
$qrPayRequestBuilder = new AlipayTradePrecreateContentBuilder();
$qrPayRequestBuilder->setOutTradeNo($outTradeNo);
$qrPayRequestBuilder->setTotalAmount($totalAmount);
$qrPayRequestBuilder->setTimeExpress($timeExpress);
$qrPayRequestBuilder->setSubject($subject);

// 调用qrPay方法获取当面付应答
$qrPay = new AlipayTradeService($config);
$qrPayResult = $qrPay->qrPay($qrPayRequestBuilder);

// 根据状态值进行业务处理
switch ($qrPayResult->getTradeStatus()){
 case "SUCCESS":
  echo "支付宝创建订单二维码成功:"."<br>---------------------------------------<br>";
  $response = $qrPayResult->getResponse();
  $qrcode = $qrPay->create_erweima($response->qr_code);
  echo $qrcode;
  print_r($response);
  
  break;
 case "FAILED":
  echo "支付宝创建订单二维码失败!!!"."<br>--------------------------<br>";
  if(!empty($qrPayResult->getResponse())){
   print_r($qrPayResult->getResponse());
  }
  break;
 case "UNKNOWN":
  echo "系统异常,状态未知!!!"."<br>--------------------------<br>";
  if(!empty($qrPayResult->getResponse())){
   print_r($qrPayResult->getResponse());
  }
  break;
 default:
  echo "不支持的返回状态,创建订单二维码返回异常!!!";
  break;
}

生成的提交请求URL如下

https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.precreate×tamp=2016-08-26+17%3A38%3A13&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=http%3A%2F%2F123.daoqidata.com%2Fweixin%2Frawpost.php&charset=UTF-8&app_auth_token=&sign=ayYiJRZ63RomVEt8Ayz58Uiyv3y5IrbbX8CTfX6zNHkT%2Fu11U7ISUYWCXjrwrwCo2Oq2tdo%2FjtuhrBbDp5ULnTmuBBUktQDCCF53PF5yiUDGikxUPFYugeUrTg3gw4DqxOiNKM6ZB6MI0n%2F9M78a%2FnP8GtZ4WthyHIl%2B%2FozSyT4%3D

发送的json数据如下:

{
 "out_trade_no":"qrpay20160826053813582",
 "total_amount":"0.01",
 "timeout_express":"5m",
 "subject":"方倍工作室-支付宝-当面付-扫码支付"
}

返回的数据如下:

{
 "alipay_trade_precreate_response":{
  "code":"10000",
  "msg":"Success",
  "out_trade_no":"qrpay20160826053813582",
  "qr_code":"https://qr.alipay.com/bax00885xbhszseo9l7p404d"
 },
 "sign":"VfNTGo2WMZ+2CE1L05lNYWtFn4inHXO/tUaBZIBHN4fPlXnCvyc9IhS8S7wa3FYw23G30luEPEHkZWobnfpUjILonmExZVElHv3ylINz+Q2mQ5M8Sb/d61YPvf4Bgy1OvlrT4D3H/i3judmzEDBrOyFN9kB9vSkKaYC+b6L41Zw="
}

其中的https://qr.alipay.com/bax00885xbhszseo9l7p404d 就是二维码链接地址,使用接口将其成二维码后。
当支付宝用户扫码的时候,接口通知将收到如下数据

{
 "notify_id":"4c2c04c3cc50e978d44212febe7c3f0lse",
 "seller_email":"pay***@fangbei.org",
 "notify_type":"trade_status_sync",
 "sign":"R0iRdYmSQ0+zuSUGLzkutHcR40hoOp+CcKojVBCMa1uji3rqQFe5XeHoJB1nMBCApE3zXPKhXMdLis109ngPbGy+NUEBR7YZjYuR/hXq3WXeYfZ8aiWLvloZHrF7dQWxDho/VHYexaLeqvRi/03m0HxrwhZKUOu1eS9wMgZOlqQ=",
 "trade_no":"2016082621001004750241229810",
 "buyer_id":"2088002364008751",
 "app_id":"2016061501500000",
 "gmt_create":"2016-08-26 18:20:37",
 "out_trade_no":"qrpay20160826062009757",
 "seller_id":"2088421202724253",
 "notify_time":"2016-08-26 18:20:37",
 "subject":"方倍工作室-支付宝-当面付-扫码支付",
 "trade_status":"WAIT_BUYER_PAY",
 "open_id":"20880044751374809757987911112575",
 "total_amount":"0.01",
 "sign_type":"RSA",
 "buyer_logon_id":"118***@qq.com"
}

当用户输入密码付款成功之后,将收到如下数据

{
 "fund_bill_list":"[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]",
 "subject":"方倍工作室-支付宝-当面付-扫码支付",
 "trade_no":"2016082621001004750241229810",
 "gmt_create":"2016-08-26 18:20:37",
 "notify_type":"trade_status_sync",
 "total_amount":"0.01",
 "out_trade_no":"qrpay20160826062009757",
 "invoice_amount":"0.01",
 "open_id":"20880044751374809757987911112575",
 "seller_id":"2088421202724253",
 "notify_time":"2016-08-26 18:20:50",
 "trade_status":"TRADE_SUCCESS",
 "gmt_payment":"2016-08-26 18:20:50",
 "seller_email":"pay***@fangbei.org",
 "receipt_amount":"0.01",
 "buyer_id":"2088002364008751",
 "app_id":"2016061501500000",
 "notify_id":"56f97611ee609f46384b188b409e75else",
 "buyer_logon_id":"118***@qq.com",
 "sign_type":"RSA",
 "buyer_pay_amount":"0.01",
 "sign":"nf/KJryACk0utqlNrnuYMiSnYw6HsxqpJPk2O5MhCZ+wZUVQbrD3sq5POO3GU7LSRoSiUUIO4JEYEL12Ek2+w3lTcLS9WEi60sYowPOcJEYGmVfNZbVR6+k7yO5au2WIkM3MKsxm2XxIB9xPMmRDACGhvqZ2BXUAQujkPk1FT0s=",
 "point_amount":"0.00"
}

3. 订单查询

订单查询的参数配置如下

////获取商户订单号
$out_trade_no = trim($_POST['out_trade_no']);

//第三方应用授权令牌,商户授权系统商开发模式下使用
$appAuthToken = "";//根据真实值填写

//构造查询业务请求参数对象
$queryContentBuilder = new AlipayTradeQueryContentBuilder();
$queryContentBuilder->setOutTradeNo($out_trade_no);

$queryContentBuilder->setAppAuthToken($appAuthToken);


//初始化类对象,调用queryTradeResult方法获取查询应答
$queryResponse = new AlipayTradeService($config);
$queryResult = $queryResponse->queryTradeResult($queryContentBuilder);

//根据查询返回结果状态进行业务处理
switch ($queryResult->getTradeStatus()){
 case "SUCCESS":
  echo "支付宝查询交易成功:"."<br>--------------------------<br>";
  print_r($queryResult->getResponse());
  break;
 case "FAILED":
  echo "支付宝查询交易失败或者交易已关闭!!!"."<br>--------------------------<br>";
  if(!empty($queryResult->getResponse())){
   print_r($queryResult->getResponse());
  }
  break;
 case "UNKNOWN":
  echo "系统异常,订单状态未知!!!"."<br>--------------------------<br>";
  if(!empty($queryResult->getResponse())){
   print_r($queryResult->getResponse());
  }
  break;
 default:
  echo "不支持的查询状态,交易返回异常!!!";
  break;
}

最终提交的url如下

https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.query×tamp=2016-08-26+18%3A27%3A07&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=&charset=UTF-8&app_auth_token=&sign=eIuYJtes95quAN3X9eXbQzBa%2FCvm5QgQ0ToUsS8MSkCjhZACYpnU7ZT5MuD31lPZPFHVEjCKsdWiq4tuNtJPFPxirg7pkTiT09C%2Bz8PsUA844Y7hjkkX%2B4CVZcGtO11m3Ap0JECrtZW8hhJTE9bPY1v43X2BSL5Cp3Ulpac1FsM%3D

发送的json数据如下:

{
 "out_trade_no":"qrpay20160826053813582"
}

接收到的数据如下

{
 "alipay_trade_query_response":{
  "code":"10000",
  "msg":"Success",
  "buyer_logon_id":"118***@qq.com",
  "buyer_pay_amount":"0.01",
  "buyer_user_id":"2088002364008751",
  "fund_bill_list":[
   {
    "amount":"0.01",
    "fund_channel":"ALIPAYACCOUNT"
   }
  ],
  "invoice_amount":"0.01",
  "open_id":"20880044751374809757987911112575",
  "out_trade_no":"qrpay20160826053813582",
  "point_amount":"0.00",
  "receipt_amount":"0.01",
  "send_pay_date":"2016-08-26 17:38:58",
  "total_amount":"0.01",
  "trade_no":"2016082621001004750239053830",
  "trade_status":"TRADE_SUCCESS"
 },
 "sign":"E2MxjdAhW/EqRFNkZgy/Y//dA5Cmb54Hnqa0cjBz+ZcFTULi1lvFms93onP7cpVK/fI7YxbkZTKBPk29o4aeWKXlSYCrT92domAyqahzYCA7/5A3Msc/awALYrFOdWyJJdlncWdFRN9hx52iVRIjxvLJ0hIMVIQqEDavG28HPbo="
}

4. 订单退款

订单退款的参数配置如下

$out_trade_no = trim($_POST['out_trade_no']);
$refund_amount = trim($_POST['refund_amount']);
$out_request_no = trim($_POST['out_request_no']);

//第三方应用授权令牌,商户授权系统商开发模式下使用
$appAuthToken = "";//根据真实值填写

//创建退款请求builder,设置参数
$refundRequestBuilder = new AlipayTradeRefundContentBuilder();
$refundRequestBuilder->setOutTradeNo($out_trade_no);
$refundRequestBuilder->setRefundAmount($refund_amount);
$refundRequestBuilder->setOutRequestNo($out_request_no);

$refundRequestBuilder->setAppAuthToken($appAuthToken);

//初始化类对象,调用refund获取退款应答
$refundResponse = new AlipayTradeService($config);
$refundResult = $refundResponse->refund($refundRequestBuilder);

//根据交易状态进行处理
switch ($refundResult->getTradeStatus()){
 case "SUCCESS":
  echo "支付宝退款成功:"."<br>--------------------------<br>";
  print_r($refundResult->getResponse());
  break;
 case "FAILED":
  echo "支付宝退款失败!!!"."<br>--------------------------<br>";
  if(!empty($refundResult->getResponse())){
   print_r($refundResult->getResponse());
  }
  break;
 case "UNKNOWN":
  echo "系统异常,订单状态未知!!!"."<br>--------------------------<br>";
  if(!empty($refundResult->getResponse())){
   print_r($refundResult->getResponse());
  }
  break;
 default:
  echo "不支持的交易状态,交易返回异常!!!";
  break;
}

最终提交的url如下

https://openapi.alipay.com/gateway.do?app_id=2016061501500000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.refund×tamp=2016-08-26+18%3A47%3A35&auth_token=&alipay_sdk=alipay-sdk-php-20160411&terminal_type=&terminal_info=&prod_code=¬ify_url=&charset=UTF-8&app_auth_token=&sign=Y1c5qWglAQ0t3brViEtqFnIJRQMn%2Fl9vMla1xgXKcExercJopMyS2rPOHaw%2F2PJEOKJC7r9qAfDGkNq4LHzXhBrD8sxLPqImPS6aWcW9p8s%2FzC2oQCJnLfaPx6lh8veHarj4WzDayeZLA48ttoQLjuMGPrITgOXYjHHyUKdBqSs%3D

发送的json数据如下:

{
 "out_trade_no":"qrpay20160826053813582",
 "refund_amount":"0.01",
 "out_request_no":"1"
}

接收到的数据如下

{
 "alipay_trade_refund_response":{
  "code":"10000",
  "msg":"Success",
  "buyer_logon_id":"123***@qq.com",
  "buyer_user_id":"2088002364008751",
  "fund_change":"Y",
  "gmt_refund_pay":"2016-08-26 18:47:41",
  "open_id":"20880044751374809757987911112575",
  "out_trade_no":"qrpay20160826053813582",
  "refund_detail_item_list":[
   {
    "amount":"0.01",
    "fund_channel":"ALIPAYACCOUNT"
   }
  ],
  "refund_fee":"0.01",
  "send_back_fee":"0.01",
  "trade_no":"2016082621001004750239053830"
 },
 "sign":"YDNSMpX5y0rQEs0ZbfNxRFVIp8hf0W30OR74cMtwKVPO2BYee6TQC+pbnwESSZ2XSGLozTyy7o+SIa07L+FMhDv/PTt6QX1mVgQv7RhzoDkls0zDRS/5/fy9Oyj01XS1wb8Od/93iNLZDkd2yw9g0He6qGYlpcXutkmwuASd7BM="
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。
PHP 相关文章推荐
解析php php_openssl.dll的作用
Jul 01 PHP
一个简单且很好用的php分页类
Oct 26 PHP
PHP使用feof()函数读文件的方法
Nov 07 PHP
php找出指定范围内回文数且平方根也是回文数的方法
Mar 23 PHP
php实现转换ubb代码的方法
Jun 18 PHP
Apache服务器下防止图片盗链的办法
Jul 06 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
Laravel框架中缓存的使用方法分析
Sep 06 PHP
laravel 关联关系遍历数组的例子
Oct 10 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 PHP
Redis使用Eval多个键值自增的操作实例
Nov 04 #PHP
php array_slice 取出数组中的一段序列实例
Nov 04 #PHP
PHP获取访问页面HTTP状态码的实现代码
Nov 03 #PHP
PHP之将POST数据转化为字符串的实现代码
Nov 03 #PHP
PHP读取文件的常见几种方法
Nov 03 #PHP
PHP自定义多进制的方法
Nov 03 #PHP
关于PHP中字符串与多进制转换函数的实例代码
Nov 03 #PHP
You might like
php数组去重复数据示例
2014/02/25 PHP
php算法实例分享
2015/07/14 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
关于B/S判断浏览器断开的问题讨论
2008/10/29 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
jquery 缓存问题的几个解决方法
2013/11/11 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
小程序实现留言板
2018/11/02 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
2019/06/10 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
JavaScript之Blob对象类型的具体使用方法
2019/11/29 Javascript
python同时给两个收件人发送邮件的方法
2015/04/30 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
python opencv之SIFT算法示例
2018/02/24 Python
django 开发忘记密码通过邮箱找回功能示例
2018/04/17 Python
Pycharm 文件更改目录后,执行路径未更新的解决方法
2019/07/19 Python
关于sys.stdout和print的区别详解
2019/12/05 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
Can a struct inherit from another class? (结构体能继承类吗)
2014/07/22 面试题
六十大寿答谢词
2014/01/12 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
俄语专业毕业生求职信
2014/07/12 职场文书
担保书范文
2015/01/20 职场文书
参观邀请函范文
2015/02/02 职场文书
老员工辞职信范文
2015/05/12 职场文书
初中历史教学反思
2016/02/19 职场文书
详解python中[-1]、[:-1]、[::-1]、[n::-1]使用方法
2021/04/25 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫