实现入出院结算通过支付宝结算交费或退款,电脑系统需要做什么更新

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
支付宝担即时到帐批量退款接口集成教程
下载积分:290
内容提示:支付宝担即时到帐批量退款接口集成教程
文档格式:PDF|
浏览次数:661|
上传日期: 08:12:36|
文档星级:
全文阅读已结束,如果下载本文需要使用
 290 积分
下载此文档
阅读此文档的用户还读了
支付宝担即时到帐批量退款接口集成教程
官方公共微信支付宝等大型支付系统退款流程是如何设计的? - 知乎574被浏览15356分享邀请回答1137 条评论分享收藏感谢收起49 条评论分享收藏感谢收起查看更多回答关键字:支付宝 当面付 条码支付 扫码支付 二维码支付 订单查询 退款作者:方倍工作室原文:&&
本文介绍支付宝中当面付下属的条码支付、扫码支付、订单查询、退款申请的集成开发过程。
本文分为以下五个部分:
条码支付和扫码支付介绍
密钥生成及配置
API及SDK集成
条码支付、扫码支付、订单查询、退款申请
注: 支付宝支付开发有一定的门槛,如果您愿意为知识付费来节省您宝贵的时间,请直接见底部说明。
一、条码支付及二维码支付介绍
1. 条码支付
条码支付是支付宝给到线下传统行业的一种收款方式。商家使用扫码枪等条码识别设备扫描用户支付宝钱包上的条码/二维码,完成收款。用户仅需出示付款码,所有收款操作由商家端完成。其使用场景如下:
业务流程:
使用步骤:
用户登陆支付宝钱包,点击首页&付款&,进入付款码界面;
收银员在商家收银系统操作生成订单,用户确认支付金额;
用户出示钱包的&付款码&,收银员用扫码设备来扫描用户手机上的条码/二维码后,商家收银系统提交支付;
付款成功后商家收银系统会拿到支付成功或者失败的结果。
2. 扫码支付
扫码支付,指用户打开支付宝钱包中的&扫一扫&功能,扫描商家展示在某收银场景下的二维码并进行支付的模式。该模式适用于线下实体店支付、面对面支付等场景。
其使用场景如下:
业务流程:
使用步骤:
用户登陆支付宝钱包,点击首页&付款-扫码付&,进入扫一扫界面;
收银员在商家收银系统操作生成支付宝订单,用户确认支付金额,并生成二维码;
用户使用钱包的&扫码付&,扫收银员提供的二维码,确认支付;
用户付款后商家收银系统会拿到支付成功或者失败的结果。
二、接口申请
企业在申请企业支付宝之后,进行功能申请并签约,然后在蚂蚁金服开放平台中申请应用如下(详细过程就略了)
然后在功能列表中,申请当面付这一功能,申请成功后如下。
这样,我们就有了当面付的权限了。
三、密钥生成
在支付宝当面付的接口中,使用了非对称加密算法,商户自己的公钥和私钥需要自己使用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请求地址
/gateway.do
公共请求参数:
参数类型是否必填最大长度描述
支付宝分配给开发者的应用ID
仅支持JSON
请求使用的编码格式,如utf-8,gbk,gb2312等
商户生成签名字符串所使用的签名算法类型,目前支持RSA
商户请求参数的签名串,详见
发送请求的时间,格式"yyyy-MM-dd HH:mm:ss"
调用的接口版本,固定为:1.0
notify_url
支付宝服务器主动通知商户服务器里指定的页面http/https路径。
app_auth_token
biz_content
请求参数的集合,最大长度不限,除公共参数外所有请求参数都必须放在这个参数中传递,具体参照各产品快速接入文档
参数类型是否必填最大长度描述
out_trade_no
商户订单号,64个字符以内、可包含字母、数字、下划线;需保证在商户端不重复
支付场景 条码支付,取值:bar_code 声波支付,取值:wave_code
支付授权码
如果该值为空,则默认为商户签约账号对应的支付宝用户ID
total_amount
订单总金额,单位为元,
discountable_amount
参与优惠计算的金额,单位为元
undiscountable_amount
不参与优惠计算的金额,单位为元
?goods_detail
GoodsDetail []
订单包含的商品列表信息,Json格式,其它说明详见商品明细说明
operator_id
商户操作员编号
商户门店编号
terminal_id
商户机具终端编号
alipay_store_id
支付宝的店铺编号
?extend_params
ExtendParams
业务扩展参数
timeout_express
该笔订单允许的最晚付款时间,逾期将关闭交易。
?royalty_info
RoyaltyInfo
描述分账信息,Json格式,其它说明详见分账说明
?sub_merchant
SubMerchant
二级商户信息,当前只对特殊银行机构特定场景下使用此字段
公共响应参数
参数类型是否必填最大长度描述
网关返回码,
网关返回码描述,
业务返回码,
业务返回码描述,
参数类型是否必填最大长度描述
支付宝交易号
out_trade_no
商户订单号
buyer_logon_id
买家支付宝账号
total_amount
receipt_amount
buyer_pay_amount
买家付款的金额
point_amount
使用积分宝付款的金额
invoice_amount
交易中可给用户开具发票的金额
gmt_payment
交易支付时间
?fund_bill_list
TradeFundBill []
交易支付使用的资金渠道
card_balance
支付宝卡余额
store_name
发生支付交易的商户门店名称
buyer_user_id
买家在支付宝的用户id
discount_goods_detail
本次交易支付所使用的单品券优惠的商品优惠信息
系统中配置如下
$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' =& "/gateway.do",
'app_id' =& "0000",
//异步通知地址,只有扫码支付预下单可用
'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());
case "FAILED":
echo "支付宝支付失败!!!" . "&br&--------------------------&br&";
if (!empty($barPayResult-&getResponse())) {
print_r($barPayResult-&getResponse());
case "UNKNOWN":
echo "系统异常,订单状态未知!!!" . "&br&--------------------------&br&";
if (!empty($barPayResult-&getResponse())) {
print_r($barPayResult-&getResponse());
echo "不支持的交易状态,交易返回异常!!!";
程序监测,最终提交的url如下
https:///gateway.do?app_id=0000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.pay&timestamp=+17%3A14%3A52&auth_token=&alipay_sdk=alipay-sdk-php-&terminal_type=&terminal_info=&prod_code=&notify_url=&charset=UTF-8&app_auth_token=&sign=EMVoBAhPkW6B1m%2BoXytdbUpIxnIAq73jtiPhlH2VUYy4OcJQ2UiVTXWttw0y%2B7UEXHWILY8fYRDoNrJWSjBATrAqbGCLpPc4YBQSwtPCb%2F76d65dMQEyrEnk2sgcqhxCiJNKRoQjgAQmBQdHneerU7SwSNJ%2FfF%2F025yltZk5lzQ%3D
发送的json数据如下:
"scene":"bar_code",
"out_trade_no":"barpay52680",
"total_amount":0.01,
"auth_code":"423535",
"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":"8751",
"fund_bill_list":[
"amount":"0.01",
"fund_channel":"ALIPAYACCOUNT"
"gmt_payment":" 17:14:59",
"invoice_amount":"0.01",
"open_id":"",
"out_trade_no":"barpay52680",
"point_amount":"0.00",
"receipt_amount":"0.01",
"total_amount":"0.01",
"trade_no":"0034"
"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);
case "FAILED":
echo "支付宝创建订单二维码失败!!!"."&br&--------------------------&br&";
if(!empty($qrPayResult-&getResponse())){
print_r($qrPayResult-&getResponse());
case "UNKNOWN":
echo "系统异常,状态未知!!!"."&br&--------------------------&br&";
if(!empty($qrPayResult-&getResponse())){
print_r($qrPayResult-&getResponse());
echo "不支持的返回状态,创建订单二维码返回异常!!!";
生成的提交请求URL如下
https:///gateway.do?app_id=0000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.precreate&timestamp=+17%3A38%3A13&auth_token=&alipay_sdk=alipay-sdk-php-&terminal_type=&terminal_info=&prod_code=&notify_url=http%3A%2F%%2Fweixin%2Frawpost.php&charset=UTF-8&app_auth_token=&sign=ayYiJRZ63RomVEt8Ayz58Uiyv3y5IrbbX8CTfX6zNHkT%2Fu11U7ISUYWCXjrwrwCo2Oq2tdo%2FjtuhrBbDp5ULnTmuBBUktQDCCF53PF5yiUDGikxUPFYugeUrTg3gw4DqxOiNKM6ZB6MI0n%2F9M78a%2FnP8GtZ4WthyHIl%2B%2FozSyT4%3D
发送的json数据如下:
"out_trade_no":"qrpay13582",
"total_amount":"0.01",
"timeout_express":"5m",
"subject":"方倍工作室-支付宝-当面付-扫码支付"
返回的数据如下:
"alipay_trade_precreate_response":{
"code":"10000",
"msg":"Success",
"out_trade_no":"qrpay13582",
"qr_code":"/bax00885xbhszseo9l7p404d"
"sign":"VfNTGo2WMZ+2CE1L05lNYWtFn4inHXO/tUaBZIBHN4fPlXnCvyc9IhS8S7wa3FYw23G30luEPEHkZWobnfpUjILonmExZVElHv3ylINz+Q2mQ5M8Sb/d61YPvf4Bgy1OvlrT4D3H/i3judmzEDBrOyFN9kB9vSkKaYC+b6L41Zw="
其中的/bax00885xbhszseo9l7p404d 就是二维码链接地址,使用接口将其成二维码后如下所示。
当支付宝用户扫码的时候,接口通知将收到如下数据
"notify_id":"4c2c04c3cc50e978d44212febe7c3f0lse",
"seller_email":"pay***@fangbei.org",
"notify_type":"trade_status_sync",
"sign":"R0iRdYmSQ0+zuSUGLzkutHcR40hoOp+CcKojVBCMa1uji3rqQFe5XeHoJB1nMBCApE3zXPKhXMdLis109ngPbGy+NUEBR7YZjYuR/hXq3WXeYfZ8aiWLvloZHrF7dQWxDho/VHYexaLeqvRi/03m0HxrwhZKUOu1eS9wMgZOlqQ=",
"trade_no":"9810",
"buyer_id":"8751",
"app_id":"0000",
"gmt_create":" 18:20:37",
"out_trade_no":"qrpay09757",
"seller_id":"4253",
"notify_time":" 18:20:37",
"subject":"方倍工作室-支付宝-当面付-扫码支付",
"trade_status":"WAIT_BUYER_PAY",
"open_id":"",
"total_amount":"0.01",
"sign_type":"RSA",
"buyer_logon_id":"118***@qq.com"
当用户输入密码付款成功之后,将收到如下数据
"fund_bill_list":"[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]",
"subject":"方倍工作室-支付宝-当面付-扫码支付",
"trade_no":"9810",
"gmt_create":" 18:20:37",
"notify_type":"trade_status_sync",
"total_amount":"0.01",
"out_trade_no":"qrpay09757",
"invoice_amount":"0.01",
"open_id":"",
"seller_id":"4253",
"notify_time":" 18:20:50",
"trade_status":"TRADE_SUCCESS",
"gmt_payment":" 18:20:50",
"seller_email":"pay***@fangbei.org",
"receipt_amount":"0.01",
"buyer_id":"8751",
"app_id":"0000",
"notify_id":"56f9384b188b409e75else",
"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());
case "FAILED":
echo "支付宝查询交易失败或者交易已关闭!!!"."&br&--------------------------&br&";
if(!empty($queryResult-&getResponse())){
print_r($queryResult-&getResponse());
case "UNKNOWN":
echo "系统异常,订单状态未知!!!"."&br&--------------------------&br&";
if(!empty($queryResult-&getResponse())){
print_r($queryResult-&getResponse());
echo "不支持的查询状态,交易返回异常!!!";
最终提交的url如下
/gateway.do?app_id=0000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.query&timestamp=+18%3A27%3A07&auth_token=&alipay_sdk=alipay-sdk-php-&terminal_type=&terminal_info=&prod_code=&notify_url=&charset=UTF-8&app_auth_token=&sign=eIuYJtes95quAN3X9eXbQzBa%2FCvm5QgQ0ToUsS8MSkCjhZACYpnU7ZT5MuD31lPZPFHVEjCKsdWiq4tuNtJPFPxirg7pkTiT09C%2Bz8PsUA844Y7hjkkX%2B4CVZcGtO11m3Ap0JECrtZW8hhJTE9bPY1v43X2BSL5Cp3Ulpac1FsM%3D
发送的json数据如下:
"out_trade_no":"qrpay13582"
接收到的数据如下
"alipay_trade_query_response":{
"code":"10000",
"msg":"Success",
"buyer_logon_id":"118***@qq.com",
"buyer_pay_amount":"0.01",
"buyer_user_id":"8751",
"fund_bill_list":[
"amount":"0.01",
"fund_channel":"ALIPAYACCOUNT"
"invoice_amount":"0.01",
"open_id":"",
"out_trade_no":"qrpay13582",
"point_amount":"0.00",
"receipt_amount":"0.01",
"send_pay_date":" 17:38:58",
"total_amount":"0.01",
"trade_no":"3830",
"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());
case "FAILED":
echo "支付宝退款失败!!!"."&br&--------------------------&br&";
if(!empty($refundResult-&getResponse())){
print_r($refundResult-&getResponse());
case "UNKNOWN":
echo "系统异常,订单状态未知!!!"."&br&--------------------------&br&";
if(!empty($refundResult-&getResponse())){
print_r($refundResult-&getResponse());
echo "不支持的交易状态,交易返回异常!!!";
最终提交的url如下
https:///gateway.do?app_id=0000&version=1.0&format=json&sign_type=RSA&method=alipay.trade.refund&timestamp=+18%3A47%3A35&auth_token=&alipay_sdk=alipay-sdk-php-&terminal_type=&terminal_info=&prod_code=&notify_url=&charset=UTF-8&app_auth_token=&sign=Y1c5qWglAQ0t3brViEtqFnIJRQMn%2Fl9vMla1xgXKcExercJopMyS2rPOHaw%2F2PJEOKJC7r9qAfDGkNq4LHzXhBrD8sxLPqImPS6aWcW9p8s%2FzC2oQCJnLfaPx6lh8veHarj4WzDayeZLA48ttoQLjuMGPrITgOXYjHHyUKdBqSs%3D
发送的json数据如下:
"out_trade_no":"qrpay13582",
"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":"8751",
"fund_change":"Y",
"gmt_refund_pay":" 18:47:41",
"open_id":"",
"out_trade_no":"qrpay13582",
"refund_detail_item_list":[
"amount":"0.01",
"fund_channel":"ALIPAYACCOUNT"
"refund_fee":"0.01",
"send_back_fee":"0.01",
"trade_no":"3830"
"sign":"YDNSMpX5y0rQEs0ZbfNxRFVIp8hf0W30OR74cMtwKVPO2BYee6TQC+pbnwESSZ2XSGLozTyy7o+SIa07L+FMhDv/PTt6QX1mVgQv7RhzoDkls0zDRS/5/fy9Oyj01XS1wb8Od/93iNLZDkd2yw9g0He6qGYlpcXutkmwuASd7BM="
&&&&我们提供支付宝接口配置SDK Demo一条龙服务,费用300元(含PHP源码提供、密钥生成、配置调试,直到demo跑通为止),需要加QQ
   & & & &有扫码支付定制开发服务,3000元起步,需要加QQ
阅读(...) 评论()2596人阅读
支付宝APP支付
之前在做公众号开发过程中有集成过微信的支付功能,但是一些帐号相关的申请与设置都由其他同事弄好后提供过来的,最近APP项目中集成微信和支付宝的功能,从相关接口权限和开发都自己亲自走了一遍,不得不说走了不少转路,今天分享下,希望对大家有所帮助吧
1、微信APP支付功能申请流程
&&&& a、打开 https://open./ (微信开发平台)进入商户管理中心,注:这里省去了帐号的注册流程
&&&& b、点击移动应用下面的’创建移动应用‘,创建一个新应用
&&&& c、创建完成后,新应用便会出现在移动应用列表中,可点击查看按钮,进入应用详情页,如下图1,2所示
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (图1)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& & & & & & & & && (图2)
&&&& d、APP微信支付接口权限需要申请才能获得,费用300元一次
&&&& e、下载微信SDK包,并将自己对应的商户号,APPid,支付密钥,公众号密钥等相关信息填入到WxPay.Config.php中
&&&& f、有一点需要特别强调下,公众号证书与APP证书不一样,APP支付接口申请下来后,会由到相关邮件,邮件中登录帐号与密码,证书就在这里下载
2、APP支付宝申请流程(支付宝的管理后台整合了比较多系统,入口不好找到)
&&& a、 打开 /platform/manageHome.htm登录支付宝,注:这里省去了帐号的注册流程
&&& b、点击我有开发能力,进入我的应用页面& /platform/appManage.htm
&&& c、如图3所示,可以对应用进行管理与创建
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& (图3)
&&&& d、如图4所示,申请应用所需要的接口权限
&&& e、下载支付宝SDK
3、一切申请通过之后,便可以开始接口的开发了
4、我这边讲解的是PHP作为后,给APP端提供支付接口的流程
&&&&& 微信大致流程为:APP端将订单信息提交到后台,后台通过微信统一下单接口到微信去下单,微信端返回相关信息到PHP后台,后台先将订单保存到数据库成功后,返回签名信息给APP端去实现真正的支付
&&& 支付宝大致流程为:APP端将订单信息提交到后台,后台通过支付宝规定的签名算法将签名信息返回给APP端,APP端调用支付宝SDK去实现支付
5、下面贴出我在开发过程中用到的代码,不是很规范,但可以借鉴
private function _wxPay($data){
$total_money = 1;
vendor('WxpayAPI.lib.WxPay#Api');
$WxPayApi = new \WxPayApi();
// 商品名称
$subject = '';
$detail=&在线支付&;
$native=&APP&;
// 订单号,示例代码使用时间值作为唯一的订单ID号
$out_trade_no = createPayid();
$unifiedOrder = new \WxPayUnifiedOrder();
$WxPayConfig=new \WxPayConfig();
$unifiedOrder-&SetBody($subject);//商品或支付单简要描述
$unifiedOrder-&SetAppid($WxPayConfig::APPID);//appid
$unifiedOrder-&SetMch_id($WxPayConfig::MCHID);//商户标识
$unifiedOrder-&SetNonce_str($WxPayApi::getNonceStr($length = 32));//随机字符串
$unifiedOrder-&SetDetail($detail);//详情
$unifiedOrder-&SetOut_trade_no($out_trade_no);//交易号
$unifiedOrder-&SetTotal_fee($data['total_money']*100);//交易金额
$unifiedOrder-&SetTrade_type($native);//应用类型
$unifiedOrder-&SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//发起充值的ip
$unifiedOrder-&SetNotify_url($WxPayConfig::NOTIFY_URL);//交易成功通知url
//$unifiedOrder-&SetTrade_type($native);//支付类型
$unifiedOrder-&SetProduct_id(time());
$unifiedOrder-&SetTime_start(date('YmdHis'));
$result = $WxPayApi::unifiedOrder($unifiedOrder);
if (is_array($result)) {
if ($result['result_code']=='SUCCESS') {
//将订单信息插入到表中
$order = D('order');
$data['id'] = $out_trade_
$data['trade_no'] = $result['prepay_id'];
$data['noncestr'] = $result['nonce_str'];
$order_info = $order-&add($data);
$wxpay_result=new \WxPayResults();
$timestamp=time();
$wxpay_result-&SetData('appid', $result['appid']);
$wxpay_result-&SetData('partnerid', $result['mch_id']);
$wxpay_result-&SetData('prepayid', $result['prepay_id']);
$wxpay_result-&SetData('timestamp', $timestamp);
$wxpay_result-&SetData('noncestr', $result['nonce_str']);
$wxpay_result-&SetData('package', 'Sign=WXPay');
$resign_result=$wxpay_result-&SetSign();
$back_data=array(
'result_code'=& C('API_CODE.SUCCESS'),
'result_msg'=&C('API_CODE.SUCCESS_MSG'),
'appid'=&$result['appid'],//appid
'partnerid'=&$result['mch_id'],//商户号
'prepayid'=&$result['prepay_id'],//与支付id
'package'=&'Sign=WXPay',
'noncestr'=&$result['nonce_str'],
'timestamp'=&$timestamp,
'sign'=&$resign_result,
echo json_encode($back_data);exit();
$back_data = array(
'result_code'=& C('API_CODE.ERROR'),
'result_msg'=&C('API_CODE.ERROR_MSG')
echo json_encode($back_data);exit();
private function _aliPay($data){
// $total_fee = 0.01;
header(&Content-type: text/ charset=utf-8&);
vendor('AlipayAPI.AopSdk');
$out_trade_no = createPayid();
//将订单信息插入到表中
$order = D('order');
$data['id'] = $out_trade_
$order_info = $order-&add($data);
$seller_id = '';
$url = 'http://域名/index.php/Home/order/ali';
$ali = array(
'service' =& 'mobile.securitypay.pay',
'partner' =& '',//
'_input_charset' =& 'utf-8',
'sign_type' =& 'RSA',
'sign' =& '',
'notify_url' =& urlencode($url),//回调地址
'out_trade_no' =& $out_trade_no,//商户网站唯一订单号
'subject' =& '',//商品名称
'payment_type' =& 1,//支付类型
'seller_id' =& $seller_id,//支付宝账号
'total_fee' =& $data['total_money'],//总金额
'body' =& '',//商品详情
$ali = $this-&argSort($ali);
$str = '';
foreach($ali as
$key =& $val){
if($key == 'sign_type' || $key == 'sign'){
if($key == ''){
$str = $key.'='.'&'.$val.'&';
$str = $str.'&'.$key.'='.'&'.$val.'&';
$sign = urlencode($this-&sign($str));
$str = $str.'&sign='.'&'.$sign.'&'.'&sign_type='.'&'.$ali['sign_type'].'&';//传给支付宝接口的数据
$data = array();
$data['result_code'] = C('API_CODE.SUCCESS');
$data['result_msg'] = C('API_CODE.SUCCESS_MSG');
$data['sign'] = $
exit(json_encode($data));
function argSort($para) {
ksort($para);
reset($para);
function sign($data) {
//读取私钥文件
$priKey = file_get_contents('../cert/rsa_private_key.pem');//私钥文件路径
//转换为openssl密钥,必须是没有经过pkcs8转换的私钥
$res = openssl_get_privatekey($priKey);
//调用openssl内置签名方法,生成签名$sign
openssl_sign($data, $sign, $res);
//释放资源
openssl_free_key($res);
//base64编码
$sign = base64_encode($sign);
* 支付宝支付
public function ali(){
//file_put_contents('ali.txt',var_export($_REQUEST, true));
$request = $_REQUEST;
if($request['trade_status'] == 'TRADE_SUCCESS'){
//说明支付宝返回支付成功,更新订单表中相关信息
//生成二维码图片
$png = $this-&order_scan($request['out_trade_no'],'../Uploads/scan/'.$request['out_trade_no'].'.png');
$order = D('order');
$order_exist = $order-&where(array('id'=&$request['out_trade_no']))-&find();
if($order_exist['status'] != 8){
$data = array();
$data['trade_no'] = $request['trade_no'];
$data['is_payed'] = 1;
$data['status'] = 2;
$data['order_scan'] = $
$data['payed_time'] = date('Y-m-d H:i:s');
$order_info = $order-&where(array('id'=&$request['out_trade_no']))-&save($data);
file_put_contents('sss.txt',var_export($order-&getLastSql(), true));
public function ali_notice(){
echo &success&;
* 微信支付回调地址
public function wx(){
//file_put_contents('sssdfdfd.txt',var_export($GLOBALS[&HTTP_RAW_POST_DATA&], true));
vendor('WxpayAPI.lib.WxPay#Api');
//file_put_contents('wx.txt',var_export($GLOBALS[&HTTP_RAW_POST_DATA&], true));
$xml = $GLOBALS[&HTTP_RAW_POST_DATA&];
$array = (array)simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
$wxpay=new \WxPayApi();
$notify=new \WxPayNotifyReply();
$WxPayResults = new \WxPayResults();
$result= $WxPayResults-&Init($xml);//获取数据并转换为数组
$data = array(
$array['appid'],
$array['mch_id'],
'nonce_str'
$array['nonce_str'],
'result_code'
$array['result_code'],
$array['openid'],
'trade_type'
$array['trade_type'],
'bank_type'
$array['bank_type'],
'total_fee'
$array['total_fee'],
'cash_fee'
$array['cash_fee'],
'transaction_id'
$array['transaction_id'],
'out_trade_no'
$array['out_trade_no'],
'time_end'
$array['time_end'],
$array['sign']
//file_put_contents('sdf.txt',var_export($result, true));
if ($result['return_code']=='SUCCESS' && $result['result_code']=='SUCCESS') {//验签通过
// file_put_contents('ali.txt',var_export(222, true));
$out_trade_no = $array['out_trade_no'];
//生成二维码图片
$png = $this-&order_scan($out_trade_no,'../Uploads/scan/'.$out_trade_no.'.png');
$order = D('order');
$data = array();
$data['status'] = 2;
$data['payed_time'] = date('Y-m-d H:i:s');
$data['transaction_id'] = $array['transaction_id'];
$data['third_party_id'] = $array['openid'];
$data['order_scan'] = $
$data['is_payed'] = 1;
$res = $order-&where(array('id'=&$out_trade_no))-&save($data);
if ($res) {
$notify-&SetReturn_code('SUCCESS');
$notify-&SetReturn_msg('OK');
$notify-&SetSign();
$notify-&SetReturn_code('FAIL');
$notify-&SetReturn_msg('客户服务器错误');
$notify-&SetReturn_code('FAIL');
$notify-&SetReturn_msg('微信支付失败');
$wxpay-&replyNotify($notify-&ToXml());
6、退款接口开发 /**
* @param $trade_no
* @param $out_trade_no
* @param $transaction_id
* @param $total_fee
* @throws \WxPayException
public function wx_refund($trade_no,$out_trade_no,$transaction_id,$total_fee){
vendor('WxpayAPI.lib.WxPay#Api');
//$total_fee=1;
$refund_fee= $total_
$input = new \WxPayRefund();
$WxPayConfig = new \WxPayConfig();
$input-&SetTransaction_id($transaction_id);
$input-&SetOut_trade_no($out_trade_no);
$input-&SetTotal_fee($total_fee*100);
$input-&SetRefund_fee($refund_fee*100);
$input-&SetOut_refund_no($WxPayConfig::MCHID.date(&YmdHis&));
$input-&SetOp_user_id($WxPayConfig::MCHID);
$info=\WxPayApi::refund($input);
if($info['return_code']=='SUCCESS'){
$order = D('order');
$order_info = $order-&where(array('id'=&$out_trade_no))-&save(array('status'=&8));
$data['result_code'] = C('API_CODE.SUCCESS');
$data['result_msg'] = C('API_CODE.SUCCESS_MSG');
$data['result_code'] = C('API_CODE.ERROR');
$data['result_msg'] = C('API_CODE.ERROR_MSG');
exit(json_encode($data));
* @param $trade_no
* @param $out_trade_no
* @param $total_fee
* @throws \Exception
public function ali_refund($trade_no,$out_trade_no,$total_fee){
//$total_fee = 0.01;
vendor('AlipayAPI.AopSdk');
$aop = new \AopClient();
$aop-&gatewayUrl = '/gateway.do';
$aop-&appId = '';
$aop-&rsaPrivateKeyFilePath = '../cert/rsa_private_key.pem';
$aop-&alipayPublicKey='../cert/alipay_public_key.pem';
$aop-&apiVersion = '1.0';
$aop-&postCharset='UTF-8';
$aop-&format='json';
$request = new \AlipayTradeRefundRequest();
$request-&setBizContent(&{& .
\&out_trade_no\&:\&$out_trade_no\&,& .
\&trade_no\&:\&$trade_no\&,& .
\&refund_amount\&:$total_fee& .
$result = $aop-&execute($request);
$responseNode = str_replace(&.&, &_&, $request-&getApiMethodName()) . &_response&;
$resultCode = $result-&$responseNode-&
if(!empty($resultCode)&&$resultCode == 10000){
$order = D('order');
$order_info = $order-&where(array('id'=&$out_trade_no))-&save(array('status'=&8));
$data['result_code'] = C('API_CODE.SUCCESS');
$data['result_msg'] = C('API_CODE.SUCCESS_MSG');
$data['result_code'] = C('API_CODE.ERROR');
$data['result_msg'] = C('API_CODE.ERROR_MSG');
exit(json_encode($data));
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:10702次
排名:千里之外
原创:30篇
(2)(1)(6)(1)(5)(11)(2)(5)

我要回帖

更多关于 支付宝商户结算规则 的文章

 

随机推荐