热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

这篇文章主要介绍了支付宝支付开发——当面付条码支付和扫码支付实例,具有一定的参考价值,有需要的可以了解一下。

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

 本文分为以下五个部分:

  • 条码支付和扫码支付介绍
  • 申请应用
  • 密钥生成及配置
  • 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 必填 - 本次交易支付所使用的单品券优惠的商品优惠信息

系统中配置如下

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

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

https://openapi.alipay.com/gateway.do&#63;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 "支付宝创建订单二维码成功:"."
---------------------------------------
"; $respOnse= $qrPayResult->getResponse(); $qrcode = $qrPay->create_erweima($response->qr_code); echo $qrcode; print_r($response); break; case "FAILED": echo "支付宝创建订单二维码失败!!!"."
--------------------------
"; if(!empty($qrPayResult->getResponse())){ print_r($qrPayResult->getResponse()); } break; case "UNKNOWN": echo "系统异常,状态未知!!!"."
--------------------------
"; if(!empty($qrPayResult->getResponse())){ print_r($qrPayResult->getResponse()); } break; default: echo "不支持的返回状态,创建订单二维码返回异常!!!"; break; }

生成的提交请求URL如下

https://openapi.alipay.com/gateway.do&#63;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 "支付宝查询交易成功:"."
--------------------------
"; print_r($queryResult->getResponse()); break; case "FAILED": echo "支付宝查询交易失败或者交易已关闭!!!"."
--------------------------
"; if(!empty($queryResult->getResponse())){ print_r($queryResult->getResponse()); } break; case "UNKNOWN": echo "系统异常,订单状态未知!!!"."
--------------------------
"; if(!empty($queryResult->getResponse())){ print_r($queryResult->getResponse()); } break; default: echo "不支持的查询状态,交易返回异常!!!"; break; }

最终提交的url如下

https://openapi.alipay.com/gateway.do&#63;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 "支付宝退款成功:"."
--------------------------
"; print_r($refundResult->getResponse()); break; case "FAILED": echo "支付宝退款失败!!!"."
--------------------------
"; if(!empty($refundResult->getResponse())){ print_r($refundResult->getResponse()); } break; case "UNKNOWN": echo "系统异常,订单状态未知!!!"."
--------------------------
"; if(!empty($refundResult->getResponse())){ print_r($refundResult->getResponse()); } break; default: echo "不支持的交易状态,交易返回异常!!!"; break; }

最终提交的url如下

https://openapi.alipay.com/gateway.do&#63;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="
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文介绍了如何使用jQuery和AJAX来实现动态更新两个div的方法。通过调用PHP文件并返回JSON字符串,可以将不同的文本分别插入到两个div中,从而实现页面的动态更新。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 阿里Treebased Deep Match(TDM) 学习笔记及技术发展回顾
    本文介绍了阿里Treebased Deep Match(TDM)的学习笔记,同时回顾了工业界技术发展的几代演进。从基于统计的启发式规则方法到基于内积模型的向量检索方法,再到引入复杂深度学习模型的下一代匹配技术。文章详细解释了基于统计的启发式规则方法和基于内积模型的向量检索方法的原理和应用,并介绍了TDM的背景和优势。最后,文章提到了向量距离和基于向量聚类的索引结构对于加速匹配效率的作用。本文对于理解TDM的学习过程和了解匹配技术的发展具有重要意义。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
author-avatar
我爱你可你不懂_516
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有