转载:LazyCat_Ky 的博客 http://www.cnblogs.com/LzayCat/p/5539095.html
在支付宝支付的开发过程中,通过自己的理解和尝试做出一点流程总结记录:
一.前往 https://doc.open.alipay.com/doc2/alipayDocIndex.htm 支付宝开放平台 点击业务接入-》即时到账 ,即可下载 即时到账DEMO。DEMO中包含 两种签名版本(MD5、RSA) 三种编程语言(CSHARP、JAVA、PHP) 两种编码格式(GBK、UTF-8),我选择是MD5签名下的PHP语言UTF-8编码。
如果项目拥有SSL加密协议,也就是HTTPS安全通道,可以使用rsa签名的方式进行开发。
二.先配置 alipay.config.php 文件:
1 //↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 2 //合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm 3 $alipay_config['partner'] = ''; 4 //收款支付宝账号,以2088开头由16位纯数字组成的字符串,一般情况下收款账号就是签约账号 5 $alipay_config['seller_id'] = $alipay_config['partner']; 6 //或者$alipay_config['seller_email']或者$alipay_config['seller_account_name'] 7 // MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm 8 $alipay_config['key'] = ''; 9 // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 10 $alipay_config['notify_url'] = "http://商户网址/create_direct_pay_by_user-PHP-UTF-8/notify_url.php"; 11 // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 12 $alipay_config['return_url'] = "http://商户网址/create_direct_pay_by_user-PHP-UTF-8/return_url.php"; 13 //签名方式 14 $alipay_config['sign_type'] = strtoupper('MD5'); 15 //字符编码格式 目前支持 gbk 或 utf-8 16 $alipay_config['input_charset']= strtolower('utf-8'); 17 //ca证书路径地址,用于curl中ssl校验 18 //请保证cacert.pem文件在当前文件夹目录中 19 $alipay_config['cacert'] = getcwd().'\\cacert.pem'; 20 //访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http 21 $alipay_config['transport'] = 'http'; 22 // 支付类型 ,无需修改 23 $alipay_config['payment_type'] = "1"; 24 // 产品类型,无需修改 25 $alipay_config['service'] = "create_direct_pay_by_user"; 26 //↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 27 //↓↓↓↓↓↓↓↓↓↓ 请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 28 // 防钓鱼时间戳 若要使用请调用类文件submit中的query_timestamp函数 29 $alipay_config['anti_phishing_key'] = ""; 30 31 // 客户端的IP地址 非局域网的外网IP地址,如:221.0.0.1 32 $alipay_config['exter_invoke_ip'] = ""; 33 //↑↑↑↑↑↑↑↑↑↑请在这里配置防钓鱼信息,如果没开通防钓鱼功能,为空即可 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
官方demo注解已经写得很详细了,值得至于的问题 $alipay_config['partner'] $alipay_config['key'] $alipay_config['seller_id/seller_email/seller_account_name'](该参数三选一 卖家的支付宝用户号/账号/账号别名) 这三个参数是由支付宝开发平台提供的。
而 $alipay_config['notify_url'] $alipay_config['return_url'] 参数 由开发者设置,设置时必须保证外网可以访问到的地址且不可以带?id=123自定义参数
'notify_url' 异步通知地址 : 这个地址是用户支付完成后,支付宝异步回调的地址,开发者必须在该地址下的PHP文件进行支付成功后业务逻辑处理。
'return_url' 同步通知地址: 这个地址是用户支付完成后,支付宝同步跳转的地址,开发者在该地址下的PHP文件处理支付宝支付成功的页面显示。
三.配置完成后 在需要需要支付的php文件中载入 require_once "/lib/alipay_submit.class.php"; 和 在支付的类里 载入 require_once PAYPATH."/alipay.config.php";
四.实例化 AlipaySubmit 类 传入参数数组 参数列表:
基本参数 | |||||
service | 接口名称 | String | 接口名称。 | 不可空 | create_direct_pay_by_user |
partner | 合作者身份ID | String(16) | 签约的支付宝账号对应的支付宝唯一用户号。 以2088开头的16位纯数字组成。 | 不可空 | 2088101011913539 |
_input_charset | 参数编码字符集 | String | 商户网站使用的编码格式,如utf-8、gbk、gb2312等。 | 不可空 | gbk |
sign_type | 签名方式 | String | DSA、RSA、MD5三个值可选,必须大写。 | 不可空 | MD5 |
sign | 签名 | String | 请参见签名。 | 不可空 | 7d314d22efba4f336fb187697793b9d2 |
notify_url | 服务器异步通知页面路径 | String(190) | 支付宝服务器主动通知商户网站里指定的页面http路径。 | 可空 | http://api.test.alipay.net/atinterface/receive_return.htm |
return_url | 页面跳转同步通知页面路径 | String(200) | 支付宝处理完请求后,当前页面自动跳转到商户网站里指定页面的http路径。 | 可空 | http://api.test.alipay.net/atinterface/receive_return.htm |
业务参数 | |||||
out_trade_no | 商户网站唯一订单号 | String(64) | 支付宝合作商户网站唯一订单号。 | 不可空 | 6843192280647118 |
subject | 商品名称 | String(256) | 商品的标题/交易标题/订单标题/订单关键字等。 该参数最长为128个汉字。 | 不可空 | 贝尔金护腕式 |
payment_type | 支付类型 | String(4) | 只支持取值为1(商品购买)。 | 不可空 | 1 |
total_fee | 交易金额 | Number | 该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。 | 不可空 | 100 |
seller_id | 卖家支付宝用户号 | String(16) |
三个参数至少必须传递一个。 当签约账号就是收款账号时,请务必使用参数seller_id,即seller_id的值与partner的值相同。 三个参数的优先级别是:seller_id>seller_account_name>seller_email。 | 不可空 | 2088002007018966 |
seller_email | 卖家支付宝账号 | String(100) | alipay-test01@alipay.com | ||
seller_account_name | 卖家支付宝账号别名 | String(100) | tstable02@alipay.com | ||
buyer_id | 买家支付宝用户号 | String(16) |
三个参数的优先级别是:buyer_id>buyer_account_name>buyer_email。 | 可空 | 2088002007018955 |
buyer_email | 买家支付宝账号 | String(100) | tstable01@alipay.com | ||
buyer_account_name | 买家支付宝账号别名 | String(100) | tstable03@alipay.com | ||
price | 商品单价 | Number | 单位为:RMB Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。此参数为单价 规则:price、quantity能代替total_fee。即存在total_fee,就不能存在price和quantity;存在price、quantity,就不能存在total_fee。 | 可空 | 10.00 |
quantity | 购买数量 | Number | price、quantity能代替total_fee。即存在total_fee,就不能存在price和quantity;存在price、quantity,就不能存在total_fee。 | 可空 | 1 |
body | 商品描述 | String(1000) | 对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 | 可空 | 美国专业护腕鼠标垫,舒缓式凝胶软垫模拟手腕的自然曲线和运动,创造和缓的GelFlex舒适地带! |
show_url | 商品展示网址 | String(400) | 收银台页面上,商品展示的超链接。 | 可空 | http://www.360buy.com/product/113714.html |
paymethod | 默认支付方式 | String | 取值范围:
如果不设置,默认识别为余额支付。 说明: 必须注意区分大小写。 | 可空 | directPay |
enable_paymethod | 支付渠道 | String | 用于控制收银台支付渠道显示,该值的取值范围请参见支付渠道。 可支持多种支付渠道显示,以“^”分隔。 | 可空 | directPay^bankPay^cartoon^cash |
anti_phishing_key | 防钓鱼时间戳 | String | 通过时间戳查询接口获取的加密支付宝系统时间戳。 如果已申请开通防钓鱼时间戳验证,则此字段必填。 | 可空 | 587FE3D2858E6B01E30104656E7805E2 |
exter_invoke_ip | 客户端IP | String(15) | 用户在创建交易时,该用户当前所使用机器的IP。 如果商户申请后台开通防钓鱼IP地址检查选项,此字段必填,校验用。 | 可空 | 128.214.222.111 |
extra_common_param | 公用回传参数 | String(100) | 如果用户请求时传递了该参数,则返回给商户时会回传该参数。 | 可空 | 你好,这是测试商户的广告。 |
it_b_pay | 超时时间 | String | 设置未付款交易的超时时间,一旦超时,该笔交易就会自动被关闭。 取值范围:1m~15d。 m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点,如1.5h,可转换为90m。 | 可空 | 1h |
token | 快捷登录授权令牌 | String(40) | 如果开通了快捷登录产品,则需要填写;如果没有开通,则为空。 | 可空 | 201103290c9f9f2c03db4267a4c8e1bfe3adfd52 |
qr_pay_mode | 扫码支付方式 | String(1) | 扫码支付的方式,支持前置模式和跳转模式。 前置模式是将二维码前置到商户的订单确认页的模式。需要商户在自己的页面中以iframe方式请求支付宝页面。具体分为以下3种:
跳转模式下,用户的扫码界面是由支付宝生成的,不在商户的域名下。
| 可空 | 1 |
qrcode_width | 商户自定二维码宽度 | Integer | 商户自定义的二维码宽度。 当qr_pay_mode=4时,该参数生效。 | 可空 | 200 |
need_buyer_realnamed | 是否需要买家实名认证 | String(2) | 是否需要买家实名认证。
| 可空 | T |
promo_param | 商户优惠活动参数 | String(128) | 商户与支付宝约定的营销透传参数。 | 可空 | {"customer201412":"Y","goods201412":"Y"} |
hb_fq_param | 花呗分期参数 | String | 参数格式:hb_fq_seller_percent ^卖家承担付费比例|hb_fq_num ^期数。
两个参数必须一起传入。 两个参数用“|”间隔。Key和value之间用“^”间隔。 具体花呗分期期数和卖家承担收费比例可传入的数值请咨询支付宝。 | 可空 | hb_fq_seller_percent^50|hb_fq_num^3 |
goods_type | 商品类型 | String(2) | 商品类型:
如果不传,默认为实物类商品。 | 可空 | 1 |
从官网给出的参数列表可以知道必须的参数有10个,
其中 service、partner、_input_charset、seller_id、payment_type、sign_type、sign 都可以通过 alipay.config.php 配置文件获取, 此外还必须传入out_trade_no、subject、total_fee。
五. 调用 AlipaySubmit 类中的 buildRequestForm 方法 传入数组参数、提交方式(post) 和 提交按钮。
1 $parameter = array( 2 "service" => trim($alipay_config['service']), 3 "partner" => trim($alipay_config['partner']), 4 "seller_email" => trim($alipay_config['seller_email']), 5 "payment_type" => trim($alipay_config['payment_type']), 6 "notify_url" => $notify_url,//异步回调 7 "return_url" => $return_url,//同步回调 8 "out_trade_no" => $ordernum,//订单号 9 "subject" => $subject, 10 "total_fee" => $total_fee, 11 "body" => $body, 12 "show_url" => $show_url, 13 "anti_phishing_key" => $anti_phishing_key, 14 "exter_invoke_ip" => $exter_invoke_ip, 15 "extra_common_param" => $extra_common_param, 16 "_input_charset" => trim(strtolower($alipay_config['input_charset'])) 17 ); 18 //建立请求 19 $alipaySubmit = new AlipaySubmit($alipay_config); 20 $html_text = $alipaySubmit->buildRequestForm($parameter,"post", ""); 21 echo $html_text;
六. 支付宝提交参数进行支付时获取签名的流程(sign_type、sign不参加签名)并以表单方式发送请求:
1.先调用buildRequestPara($para_temp)方法 将传入的参数进行处理(排序签名);
2.paraFilter($para_temp)方法是对数组中的空值和签名参数(sign_type、sign)进行排除;
3.argSort($para_filter)方法是对数组进行排序;
4.$this->buildRequestMysign($para_sort)方法是将数组进行签名(把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串);
5.在buildRequestMysign方法中数组参数和配置文件(alipay.config.php)中key参数进行MD5加密返回签名字符串;
6.最后将签名字符串和签名类型也加入请求数组参数中;
7.将请求参数进行循环组装成表单弹出新页面自动提交表单。
1 $sHtml = "<form id='alipaysubmit' name='alipaysubmit' action='".$this->alipay_gateway_new."_input_charset=".trim(strtolower($this->alipay_config['input_charset']))."' method='".$method."'>"; 2 while (list ($key, $val) = each ($para)) { 3 $sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>"; 4 } 5 6 //submit按钮控件请不要含有name属性 7 $sHtml = $sHtml."<input type='submit' value='".$button_name."'></form>"; 8 9 $sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>"; 10 11 return $sHtml;
七.支付成功后的回调 (回调页面已经传给支付宝服务器,支付宝服务器会在支付完成后对支付回调页面进行请求并传回支付参数)
1.页面同步回传的参数(通知地址:'return_url')
参数 | 参数名称 | 类型(字节长度) | 参数说明 | 是否可为空 | 样例 |
---|---|---|---|---|---|
is_success | 成功标识 | String(1) | 表示接口调用是否成功,并不表明业务处理结果。 | 不可空 | T |
sign_type | 签名方式 | String | DSA、RSA、MD5三个值可选,必须大写。 | 不可空 | MD5 |
sign | 签名 | String(32) | 请参见签名验证 | 不可空 | b1af584504b8e845ebe40b8e0e733729 |
out_trade_no | 商户网站唯一订单号 | String(64) | 对应商户网站的订单系统中的唯一订单号,非支付宝交易号。需保证在商户网站中的唯一性。是请求时对应的参数,原样返回。 | 可空 | 6402757654153618 |
subject | 商品名称 | String(256) | 商品的标题/交易标题/订单标题/订单关键字等。 | 可空 | 手套 |
payment_type | 支付类型 | String(4) | 只支持取值为1(商品购买)。 | 可空 | 1 |
exterface | 接口名称 | String | 标志调用哪个接口返回的链接。 | 可空 | create_direct_pay_by_user |
trade_no | 支付宝交易号 | String(64) | 该交易在支付宝系统中的交易流水号。最长64位。 | 可空 | 2014040311001004370000361525 |
trade_status | 交易状态 | String | 交易目前所处的状态。成功状态的值只有两个: TRADE_FINISHED(普通即时到账的交易成功状态); TRADE_SUCCESS(开通了高级即时到账或机票分销产品后的交易成功状态) | 可空 | TRADE_FINISHED |
notify_id | 通知校验ID | String | 支付宝通知校验ID,商户可以用这个流水号询问支付宝该条通知的合法性。 | 可空 | RqPnCoPT3K9%2Fvwbh3I%2BODmZS9o4qChHwPWbaS7UMBJpUnBJlzg42y9A8gQlzU6m3fOhG |
notify_time | 通知时间 | Date | 通知时间(支付宝时间)。格式为yyyy-MM-dd HH:mm:ss。 | 可空 | 2008-10-23 13:17:39 |
notify_type | 通知类型 | String | 返回通知类型。 | 可空 | trade_status_sync |
seller_email | 卖家支付宝账号 | String(100) | 卖家支付宝账号,可以是Email或手机号码。 | 可空 | chao.chenc1@alipay.com |
buyer_email | 买家支付宝账号 | String(100) | 买家支付宝账号,可以是Email或手机号码。 | 可空 | tstable01@alipay.com |
seller_id | 卖家支付宝账户号 | String(30) | 卖家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字。 | 可空 | 2088002007018916 |
buyer_id | 买家支付宝账户号 | String(30) | 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字。 | 可空 | 2088101000082594 |
total_fee | 交易金额 | Number | 该笔订单的资金总额,单位为RMB-Yuan。取值范围为[0.01,100000000.00],精确到小数点后两位。 | 可空 | 10.00 |
body | 商品描述 | String(1000) | 对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。 | 可空 | Hello |
extra_common_param | 公用回传参数 | String | 用于商户回传参数,该值不能包含“=”、“&”等特殊字符。如果用户请求时传递了该参数,则返回给商户时会回传该参数。 | 可空 | 你好,这是测试商户的广告。 |
根据 trade_status 的状态可以知道订单的支付状态可以进行对支付成功后的业务逻辑处理。注意 通过GET获取参数。
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') { //不管普通或者高级 都执行此处 //判断该笔订单是否在商户网站中已经做过处理 //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序 //如果有做过处理,不执行商户的业务程序 }
因为订单有可能已经通过异步进行处理了,所以需要先进行判断订单是否已经处理,如果处理就不再处理直接展示成功页面,如果未处理就处理业务后展示成功页面。
2.页面异步回传的参数(通知地址:'notify_url')
参数 | 参数名称 | 类型(字节长度) | 参数说明 | 是否可为空 | 样例 |
---|---|---|---|---|---|
notify_time | 通知时间 | Date | 通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。 | 不可空 | 2009-08-12 11:08:32 |
notify_type | 通知类型 | String | 通知的类型。 | 不可空 | trade_status_sync |
notify_id | 通知校验ID | String | 通知校验ID。 | 不可空 | 70fec0c2730b27528665af4517c27b95 |
sign_type | 签名方式 | String | DSA、RSA、MD5三个值可选,必须大写。 | 不可空 | DSA |
sign | 签名 | String | 请参见签名验证。 | 不可空 | _p_w_l_h_j0b_gd_aejia7n_ko4_m%2Fu_w_jd3_nx_s_k_mxus9_hoxg_y_r_lunli_pmma29_t_q%3D |
out_trade_no | 商户网站唯一订单号 | String(64) | 对应商户网站的订单系统中的唯一订单号,非支付宝交易号。需保证在商户网站中的唯一性。是请求时对应的参数,原样返回。 | 可空 | 3618810634349901 |
subject | 商品名称 | String(256) | 商品的标题/交易标题/订单标题/订单关键字等。它在支付宝的交易明细中排在第一列,对于财务对账尤为重要。是请求时对应的参数,原样通知回来。 | 可空 | phone手机 |
payment_type | 支付类型 | String(4) | 只支持取值为1(商品购买)。 | 可空 | 1 |
trade_no | 支付宝交易号 | String(64) | 该交易在支付宝系统中的交易流水号。最长64位。 | 可空 | 2014040311001004370000361525 |
trade_status | 交易状态 | String | 取值范围请参见交易状态。 | 可空 | TRADE_FINISHED |
gmt_create | 交易创建时间 | Date | 该笔交易创建的时间。格式为yyyy-MM-dd HH:mm:ss。 | 可空 | 2008-10-22 20:49:31 |
gmt_payment | 交易付款时间 | Date | 该笔交易的买家付款时间。格式为yyyy-MM-dd HH:mm:ss。 | 可空 | 2008-10-22 20:49:50 |
gmt_close | 交易关闭时间 | Date | 交易关闭时间。格式为yyyy-MM-dd HH:mm:ss。 | 可空 | 2008-10-22 20:49:46 |
refund_status | 退款状态 | String | 取值范围请参见退款状态。 | 可空 | REFUND_SUCCESS |
gmt_refund | 退款时间 | Date | 卖家退款的时间,退款通知时会发送。格式为yyyy-MM-dd HH:mm:ss。 | 可空 | 2008-10-29 19:38:25 |
seller_email | 卖家支付宝账号 | String(100) | 卖家支付宝账号,可以是email和手机号码。 | 可空 | chao.chenc1@alipay.com |
buyer_email | 买家支付宝账号 | String(100) | 买家支付宝账号,可以是Email或手机号码。 | 可空 | 13758698870 |
seller_id | 卖家支付宝账户号 | String(30) | 卖家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字。 | 可空 | 2088002007018916 |
buyer_id | 买家支付宝账户号 | String(30) | 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字。 | 可空 | 2088002007013600 |
price | 商品单价 | Number | 如果请求时使用的是total_fee,那么price等于total_fee;如果请求时使用的是price,那么对应请求时的price参数,原样通知回来。 | 可空 | 10.00 |
total_fee | 交易金额 | Number | 该笔订单的总金额。请求时对应的参数,原样通知回来。 | 可空 | 10.00 |
quantity | 购买数量 | Number | 如果请求时使用的是total_fee,那么quantity等于1;如果请求时使用的是quantity,那么对应请求时的quantity参数,原样通知回来。 | 可空 | 1 |
body | 商品描述 | String(1000) | 该笔订单的备注、描述、明细等。对应请求时的body参数,原样通知回来。 | 可空 | Hello |
discount | 折扣 | Number | 支付宝系统会把discount的值加到交易金额上,如果需要折扣,本参数为负数。 | 可空 | -5 |
is_total_fee_adjust | 是否调整总价 | String(1) | 该交易是否调整过价格。 | 可空 | N |
use_coupon | 是否使用红包买家 | String(1) | 是否在交易过程中使用了红包。 | 可空 | N |
extra_common_param | 公用回传参数 | String | 用于商户回传参数,该值不能包含“=”、“&”等特殊字符。如果用户请求时传递了该参数,则返回给商户时会回传该参数。 | 可空 | 你好,这是测试商户的广告。 |
business_scene | 是否扫码支付 | String | 回传给商户此标识为qrpay时,表示对应交易为扫码支付。目前只有qrpay一种回传值。非扫码支付方式下,目前不会返回该参数。 | 可空 | qrpay |
根据 trade_status 的状态可以知道订单的支付状态可以进行对支付成功后的业务逻辑处理。注意 通过POST获取参数。
trade_status 的状态
触发条件名 | 触发条件描述 | 触发条件默认值 |
---|---|---|
TRADE_FINISHED | 交易完成 | true(触发通知) |
TRADE_SUCCESS | 支付成功 | true(触发通知) |
WAIT_BUYER_PAY | 交易创建 | false(不触发通知) |
TRADE_CLOSED | 交易关闭 | false(不触发通知) |
因为订单有可能已经通过同步进行处理了,所以需要先进行判断订单是否已经处理,如果处理就不再处理,如果未处理就处理业务。
注意:
- 程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);
- 当商户收到服务器异步通知并打印出success时,服务器异步通知参数notify_id才会失效。
- 验证是否是支付宝发来的通知 :
请求的完整链接 https:
//mapi.alipay.com/gateway.do?service=notify_verify&partner=2088002396712354¬ify_id=RqPnCoPT3K9%252Fvwbh3I%252BFioE227%252BPfNMl8jwyZqMIiXQWxhOCmQ5MQO%252FWd93rvCB%252BaiGg
返回数据(纯文本)成功时:true,不成功时:报对应错误。
- 业务数据处理:
商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,并判断total_fee是否确实为该订单的 实际金额(即商户订单创建时的金额),同时需要校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔 单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),上述有任何一个 验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处 理,并且过滤重复的通 知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。 如果商户需要对同步返回的数据做验签,必须通过服务端的签名验签代码逻辑 来实现。如果商户未正确处理业务通知,存在潜在的风险,商户自行承担因此而产生的所有损失。
交易状态TRADE_SUCCESS的通知触发条件是商户签约的产品支持退款功能的前提下,买家付款成功;
交易状态TRADE_FINISHED的通知触发条件是商户签约的产品不支持退款功能的前提下,买家付款成功;或者,商户签约的产品支持退款功能的前提下,交易已经成功并且已经超过可退款期限;
交易成功之后,商户(高级即时到账或机票平台商)可调用批量退款接口,系统会发送退款通知给商户,具体内容请参见批量退款接口文档;
当商户使用站内退款时,系统会发送包含refund_status和gmt_refund字段的通知给商户。