支付宝交互处理流程
- 格式:doc
- 大小:43.22 KB
- 文档页数:3
java后台实现⽀付宝对账功能的⽰例代码完成⽀付宝⽀付、查询的接⼝之后,我们应该还需要定时与⽀付宝进⾏对账,以确保商户系统的订单信息是正确的,想知道⽀付宝⽀付、查询接⼝实现过程的亲们,可移步到有详细过程。
现在我们来讲⼀下⽀付宝对账的功能,关于与⽀付宝交互的关键代码,其实⽀付宝的API已经讲得很清楚,如果亲们想直接看⽀付宝API,点击,当然我在⽂章也会进⾏说明解释。
实现⽀付宝⾃动对账功能先看⼀下商户系统和⽀付宝的⼤概交互过程:所谓对账,其实就是调⽤⽀付宝查询接⼝,跟上⼀篇的查询接⼝不同的是,上⼀篇的查询接⼝是针对特定的⼀个订单,通过订单号或者⽀付宝交易号去查询这⼀笔订单的信息,⽽对账,我们需要获取⼀个时间段的所有订单信息,因此,我们⾃然⽽已的去看⽀付宝提供的SDK是否有提供该接⼝给我们,经过查看⽀付宝API,我们发现确实我们所需要的接⼝:alipay.data.dataservice.bill.downloadurl.query。
废话不多说,先上我实现的代码1.先是调⽤⽀付宝的对账查询接⼝,获取账单⽂件下载地址URL,关于⼀些⽀付宝的公共参数,在上⼀篇我已经封装好,下⾯代码是针对对账的实现过程,传⼊关键的2个业务参数.公共参数⽀付宝SDK 已经封装好。
第⼀个参数,账单类型(字符串类型,trade或者signcustomer,具体含义见⽀付宝API)第⼆个参数,获取时间段(字符串类型,(2018-03-15)需要下载的账单⽇期,最晚是当期⽇期的前⼀天)/*** 实现⽀付宝对账* @param request* @return response*/@Overridepublic void alipayBill() {("==================向⽀付宝发起对账请求");// 获取⽀付宝⽀付的配置信息ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();Payment alipayment = (Payment) valueOps.get("alipayment");if (alipayment == null) {alipayment = alipayMentOrderRepository.getPayment(1, 1);}try {//实例化客户端(参数:⽹关地址、商户appid、商户私钥、格式、编码、⽀付宝公钥、加密类型)AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, alipayment.getAppid(),AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET,AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);AlipayDataDataserviceBillDownloadurlQueryRequest request = new AlipayDataDataserviceBillDownloadurlQueryRequest();//创建API对应的request类request.setBizContent("{" +"\"bill_type\":\"trade\"," +"\"bill_date\":\"2018-03-14\"}"); //设置业务参数AlipayDataDataserviceBillDownloadurlQueryResponse response = alipayClient.execute(request);String billDownloadUrl=response.getBillDownloadUrl();("==================⽀付宝返回⽂件下载地址:"+billDownloadUrl);this.downBill(billDownloadUrl); //调⽤下载⽂件⽅法} catch (AlipayApiException e) {// TODO Auto-generated catch blocke.printStackTrace();}//通过alipayClient调⽤API,获得对应的response类//根据response中的结果继续业务逻辑处理}2.获取到⽀付宝返回的订单⽂件下载地址之后,我们直接把它下载到本地,下载的代码如下:/*** 下载账单⽂件:* @param request* @return response*/public String downBill(String billDownloadUrl){long filename=new Date().getTime();//指定希望保存的⽂件路径String filePath = "G:/alipay/billfile/fund_bill_"+filename+".zip";URL url = null;HttpURLConnection httpUrlConnection = null;InputStream fis = null;FileOutputStream fos = null;try {url = new URL(billDownloadUrl);httpUrlConnection = (HttpURLConnection) url.openConnection();httpUrlConnection.setConnectTimeout(5 * 1000);httpUrlConnection.setDoInput(true);httpUrlConnection.setDoOutput(true);httpUrlConnection.setUseCaches(false);httpUrlConnection.setRequestMethod("GET");httpUrlConnection.setRequestProperty("Charsert", "UTF-8");httpUrlConnection.connect();fis = httpUrlConnection.getInputStream();byte[] temp = new byte[1024];int b;fos = new FileOutputStream(new File(filePath));while ((b = fis.read(temp)) != -1) {fos.write(temp, 0, b);fos.flush();}} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally {try {if(fis!=null) fis.close();if(fos!=null) fos.close();if(httpUrlConnection!=null) httpUrlConnection.disconnect();} catch (IOException e) {e.printStackTrace();}}return null;}以上就是与⽀付宝交互的过程,⽀付宝API上也能找到这些代码,完成以上2步之后,我们就可以下载每⽇账单⽂件了我下载下来是这样的,上个图:解压之后:打开excel(汇总)是这样的:⾄此,我们已经拿到了⽀付宝提供的每⽇账单⽂件,接下来才是重头戏,⽬前还没有确定选择哪种⽅案进⾏⾃动对账确定之后,会把过程也补上。
支付解决方案1. 引言随着互联网的迅猛发展,电子支付成为现代社会的必需品。
无论是在线购物、移动应用还是传统实体店铺,支付解决方案都是不可或缺的。
对于企业来说,选择一个合适的支付解决方案,能够为他们的业务增加便利性并提升用户体验。
本文将介绍几种常见的支付解决方案,包括第三方支付平台、支付网关和自建支付系统。
我们将对它们的工作原理、优点和适用场景进行分析和比较,帮助企业选择适合自己的支付解决方案。
2. 第三方支付平台第三方支付平台是指独立的金融服务机构,为用户和商家提供支付服务。
用户可以通过第三方支付平台进行支付,商家收到支付款项后再从第三方支付平台提现。
常见的第三方支付平台包括支付宝、微信支付等。
2.1 工作原理第三方支付平台的工作原理可以简单概括为以下几个步骤:1.用户在商家平台上选择使用第三方支付平台进行支付。
2.商家将支付请求发送给第三方支付平台。
3.用户在第三方支付平台上完成支付操作,包括输入支付密码、选择支付方式等。
4.第三方支付平台将支付结果通知给商家。
5.商家根据支付结果处理订单。
2.2 优点第三方支付平台有以下几个优点:•安全性高:第三方支付平台使用了多种安全技术,保障用户的支付信息不被泄露。
•便捷性好:用户只需要在第三方支付平台上完成支付,无需每次在商家平台输入支付信息。
•可扩展性强:第三方支付平台通常支持多种支付方式和银行,可以满足不同用户的支付需求。
2.3 适用场景第三方支付平台适用于各种规模的企业,特别是对于刚刚开始运营的小型企业或不具备自建支付系统能力的企业。
它们可以快速接入第三方支付平台,提供方便快捷的支付方式给用户,减少了开发和维护自己的支付系统所需的成本和风险。
3. 支付网关支付网关是一个连接商家、用户和银行之间的桥梁,负责处理支付请求和支付交易。
它提供了支付接口和支付网站,用户可以在支付网站上完成支付操作。
商家通过支付接口和支付网关进行支付请求的发送和接收。
3.1 工作原理支付网关的工作原理可以简单概括为以下几个步骤:1.用户在商家平台上选择支付网关进行支付。
34-⽀付宝⽀付⽀付宝⽀付⼀、快速连接通道1. ⽀付宝<1>. ⽀付宝API:六⼤接⼝<2>. ⽀付宝⼯作流程<3>. ⽀付宝8次异步通知机制(⽀付宝对我们的服务器发送POST请求,索要success7个字符)2. 沙箱环境<1>. 在沙箱环境下实名认证<2>. 电脑⽹站⽀付API<3>. 完成RSA秘钥⽣成<4>. 在开发中⼼的沙箱应⽤下设置应⽤公钥填⼊⽣成的公钥⽂件中的内容<5>. Python⽀付宝开源框架pip install python-alipay-sdk --upgrade<6>. 公钥私钥设置"""# alipay_public_key.pem-----BEGIN PUBLIC KEY-----⽀付宝公钥-----END PUBLIC KEY-----# app_private_key.pem-----BEGIN RSA PRIVATE KEY-----⽤户私钥-----END RSA PRIVATE KEY-----"""<7>. ⽀付宝回调连接⼆、⽀付流程图三、⽀付宝介⼊⼊门1. 流程'''# ⽀付宝开放平台1. 服务范围(⾃研开发服务) -> 实名认证2. 控制台 -> 我的应⽤ -> 创建应⽤ -> ⽹页&移动应⽤ -> ⽀付接⼊ -> 应⽤名称 -> 应⽤图标 ->1) 移动应⽤ -> 应⽤平台 -> Bundle ID ...2) ⽹页应⽤ (不成功. 需要使⽤营业执照) -> ⽹址url -> 简介注意: 先选择功能再审核能⼒列表:添加能⼒ -> ⽀付能⼒ -> 电脑⽹站⽀付 开发设置:加签管理 -> 公钥 -⽀付宝⽹关应⽤⽹关授权回调地址3. ⽂档 -> ⽹页 & 移动应⽤接⼝⽂档能⼒列表1) 开放能⼒:⽀付能⼒ -> 电脑⽹站⽀付2) 产品介绍:注意: 会跳到⽀付宝的页⾯, ⽀付宝会有⼀个get页⾯回调, post数据返回后端回调费率: 0.6%3) 快速接⼊:SDK快速接⼊: python没有, 只能使⽤API开发⽀付流程: 下单 -> 商户系统 -> ⽀付宝 -> 回调(get显⽰订单结果, post修改订单状态)4) ⽀付API:公共请求参数请求参数订单号 out_trade_no总⾦额 total_amount订单标题 subjet公共响应参数⽀付宝交易号 trade_no我们的订单号 out_trade_no5) GitHub开源SDKpip install python-alipay-sdk# ⽀付宝沙箱环境1. 沙箱环境地址: https:///platform/appDaily.htm2. 沙箱应⽤:APPID⽀付宝⽹关: 地址中带dev表⽰沙箱环境, 不带表⽰正式环境加密⽅式: 使⽤⽀付宝提供的密钥⽣成(⽀付宝开放平台组助⼿).之前是xx.jar包, 现在变成xx.exe软件. 需要⽣成公钥和私钥将⾃⼰的公钥配置在⽀付宝中, ⽀付宝会⽣成⼀个⽀付宝的公钥.3. 项⽬中使⽤:注释 .read这⾥是操作⽂件的app_private_key_string 配置⾃⼰的私钥alipay_public_key_string 配置⽀付宝的公钥注意: 不能有空格AliPay类中的参数配置:APPID配置沙箱环境的APPIDsign_type 配置⾃⼰的 RSA2debug=False测试环境, True正式环境alipay.api_alipay_trade_page_pay中的参数配置:return_url 回调地址 (注意: 需要使⽤公⽹地址)notify_url 回调地址⽀付宝⽹关 + order_string => ⽣成连接地址提⽰: ⽣成连接地址打开会出现钓鱼⽹站异常4. 解决提⽰钓鱼问题: 浏览器⾥⾯有多个窗⼝沙箱环境存在的问题, 如果出现问题, 开⽆痕窗⼝即可, 付完之后会回调到之前配置的return_url中配置的⽹页⽀付宝沙箱环境充值:控制台 -> 沙箱账号 -> 账户余额# ⽀付宝公私密钥⽣成, sdk使⽤⽀付宝开放平台组助⼿使⽤: ⽣成公私钥⽀付宝开放平台下载:https:///ide/getPluginUrl.htm?clientType=assistant&platform=win&channelType=WEB密钥长度: RSA2密钥格式: PKCS1⽣成即可GitHub开源SDK:⽀付宝开源框架地址: https:///fzlee/alipaypip install python-alipay-sdk# 拓展:xx.apk 如果apk使⽤QQ 或者微信传送, 它会改名, 再后⾯加个.1 -> xx.apk.1. ⽬的就是防⽌恶意软件.如果你需要安装, 只需要将后缀名修改过来即可'''2. 测试⽬录结构3. t_alipay.pyfrom alipay import AliPayapp_private_key_string = """-----BEGIN rsa2 PRIVATE KEY-----MIIEowIBAAKCAQEAr6my/KRUtoPcQzuBt8TZtxLvLtwI8Rf/ETubH6dfi143yuiHd0SnfTctD+ZTmGyRHxuqNwwTNV4CN0d58wuI2F3hky4Tm8ocp8n0tzjlYxDvoh1b4d4ksxXCM0yhSzywdIK+K+Y9VP74uU4mlT47oBFUs6TBK9AAlMfZfoPTUAUjSDF -----END rsa2 PRIVATE KEY-----"""alipay_public_key_string = """-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCqAQEAgvXw19HTUH0t1thzkoq8KBhDBwFCoDqRJyBYnpN/KOTxTuSoUR0+pLK3vJbeQ0w5GJ/tiHpLh38hc88LNSR5nk26IBXX8WuNmxxC56d/A4/AaqiO3xgs9jKZjvYs0xuaFkwLswMuD8vm3 -----END PUBLIC KEY-----"""alipay = AliPay(appid="2021000117620642",app_notify_url=None, # 默认回调urlapp_private_key_string=app_private_key_string,# ⽀付宝的公钥,验证⽀付宝回传消息使⽤,不是你⾃⼰的公钥,alipay_public_key_string=alipay_public_key_string,sign_type="RSA2", # rsa2 或者 RSA2debug=False # 默认False)# 如果你是 Python 3的⽤户,使⽤默认的字符串即可subject = "测试订单"# 电脑⽹站⽀付,需要跳转到https:///gateway.do? + order_stringalipay_url = 'https:///gateway.do?'order_string = alipay.api_alipay_trade_page_pay(out_trade_no="20161112", # 订单号, 必须唯⼀total_amount=10, # 总⾦额subject=subject, # 订单标题return_url="http://139.196.184.91/", # 同步回调(⽀付成功)notify_url="http://139.196.184.91/" # 异步回调(订单状态) 可选, 不填则使⽤默认notify url)print(alipay_url + order_string)4. 注意事项from alipay import AliPayapp_private_key_string = """-----BEGIN rsa2 PRIVATE KEY-----MIIEowIBAAKCAQEAr6my/KRUtoPcQzuBt8TZtxLvLtwI8Rf/ETubH6dfi143yuiHd0SnfTctD+ZTmGyRHxuqNwwTNV4CN0d58wuI2F3hky4Tm8ocp8n0tzjlYxDvoh1b4d4ksxXCM0yhSzywdIK+K+Y9VP74uU4mlT47oBFUs6TBK9AAlMfZfoPTUAUjSDF -----END rsa2 PRIVATE KEY-----"""alipay_public_key_string = """-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgvXw19HTUH0t1thzkoq8KBhDBwFCoDqRJyBYnpN/KOTxTuSoUR0+pLK3vJbeQ0w5GJ/tiHpLh38hc88LNSR5nk26IBXX8WuNmxxC56d/A4/AaqiO3xgs9jKZjvYs0xuaFkwLswMuD8vm3x -----END PUBLIC KEY-----"""alipay = AliPay(appid="2021000117620642",app_notify_url=None, # 默认回调urlapp_private_key_string=app_private_key_string,# ⽀付宝的公钥,验证⽀付宝回传消息使⽤,不是你⾃⼰的公钥,alipay_public_key_string=alipay_public_key_string,sign_type="RSA2", # rsa2 或者 RSA2debug=False # 默认False)# 如果你是 Python 3的⽤户,使⽤默认的字符串即可subject = "测试订单"# 电脑⽹站⽀付,需要跳转到https:///gateway.do? + order_stringalipay_url = 'https:///gateway.do?'order_string = alipay.api_alipay_trade_page_pay(out_trade_no="20161112", # 订单号, 必须唯⼀total_amount=10, # 总⾦额subject=subject, # 订单标题return_url="http://139.196.184.91/", # 同步回调(⽀付成功)notify_url="http://139.196.184.91/" # 异步回调(订单状态) 可选, 不填则使⽤默认notify url)print(alipay_url + order_string)四、⽀付宝⼆次封装1. GitHub开源框架参考https:///fzlee/alipay2. 调⽤⽀付宝⽀付SDKpip install python-alipay-sdk --upgrade3. 流程'''1. libs中新建⽂件, ⽂件中新建__init__.py, 新建.py⽂件2. 将之前写死的 app...string 等, 修改成从⽂件中读取 open().read()3. 新建⽂件夹存放⽀付宝公钥和⾃⼰的私钥⽤于被第⼆步读取公钥私钥存放的⽂件格式是:-----xxx-----公钥或者私钥-----xxx-----4. 新建settings.py⽂件存放⼀些常量5. debug 配置成和 setting.py中的debug⼀直性6. 使⽤三元运算配置⽀付宝的⽀付⽹关7. 使⽤__init__.py优化导⼊的层级注意: ⽹站⽀付alipay.api_alipay_trade_page_pay放到外⾯书写和订单⼀起.'''4. ⽬录结构libs├── al_alipay # aliapy⼆次封装包│├── __init__.py # 包⽂件│├── pem # 公钥私钥⽂件夹││├── alipay_public_key.pem # ⽀付宝公钥⽂件││├── app_private_key.pem # 应⽤私钥⽂件│├── pay.py # ⽀付⽂件└──└── settings.py # 应⽤配置5. pem/alipay_public_key.pem-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt99Bp0XLP1Zu2WdRu74CMB/tVx1/2thIo8t3oAo8eD8smku1e76PfeOw4iqYMHU32Vq1Fg7BLa9oPMw7Ro+kNjX4jTDz4wC3LA6dUI5OeGxYd9+tkpsBwyg+buVNhhogppQn5rcCzkRFTx0D -----END PUBLIC KEY-----6. pem/app_private_key.pem-----BEGIN RSA PRIVATE KEY-----MIIEowIBAAKCAQEAj91mUtyrPlFFkfoLB+66lYcwexzXzEt6SlJuxsj3lW6+8pqla4YKqiUf98DeuBpX+USFm+baYFPqP5FWKyAUmGSDU8T4xD9BwLc+gm7rjeEjE5LzdyMInoEjW0QKXnn6S5y4gGPwI2WjOhg9vfr2R0GTDMTqn4i7zDB/u+wTksX5e -----END RSA PRIVATE KEY-----7. __init__.pyfrom .alipay_task import alipay, alipay_gateway8. pay.pyfrom alipay import AliPayfrom . import settingsalipay = AliPay(appid=settings.APPID,app_notify_url=None,app_private_key_string=settings.APP_PRIVATE_KEY_SIRING,alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_SIRING,sign_type=settings.SIGN_TYPE,debug=settings.DEBUG,)gateway = settings.GATEWAY9. settings.pyimport osAPPID = '2021000117613064'# 默认回调APP_NOTIFY_URL = None# ⾃⼰私钥APP_PRIVATE_KEY_SIRING = open(os.path.join(os.path.dirname(__file__), 'pem', 'app_private_kay.pem')).read()# 阿⾥公钥ALIPAY_PUBLIC_KEY_SIRING = open(os.path.join(os.path.dirname(__file__), 'pem', 'alipay_public_key.pem')).read()# 标签加密类型SIGN_TYPE = 'RSA2'# True表⽰测试沙箱环境DEBUG = True# 阿⾥⽹关GATEWAY = 'https:///gateway.do?' if DEBUG else 'https:///gateway.do?'10. 配置⽂件中配置⽀付宝替换接⼝:settings.py|开发⼈员# 后台基URLBASE_URL = 'http://139.196.184.91:8000' # 注意: 这⾥的8000上线以后指定的nginx的8000端⼝, 由nginx的8000端⼝发送到nginx配置内部的uwsgi的端⼝中# 前台基URLLUFFY_URL = 'http://139.196.184.91' # 注意: 这⾥没有写端⼝默认就是80端⼝.# ⽀付宝同步异步回调接⼝配置# 后台: ⽀付宝异步回调的接⼝NOTIFY_URL = BASE_URL + "/order/success/"# 前台: ⽀付宝同步回调接⼝,没有 / 结尾RETURN_URL = LUFFY_URL + "/pay/success"五、后台-⽀付接⼝1. 订单模块表<1>. 流程'''1. 新建订单app, 注册, ⼦路由urls, 总路由分发,2. 表分析订单表:订单标题, 总价格, 订单id(⾃⼰的), 流⽔号(⽀付宝), 订单状态, ⽀付⽅式, ⽀付时间, 订单⽤户(注意: 导⼊⽤户表路径尽量⼩), 创建时间, 更新时间订单⼀对多外键, 课程⼀对多外键(级联删除改为Set_NULL, null=True), 原价格, 实价str的健壮性校验订单和订单详情表关系分析: ⼀对多订单详情是多的⼀⽅⼀个订单可以有多个订单详情, ⼀个订单详情不可以同时属于多个订单.订单表和课程表关系分析: 多对多⼀个订单可以包含多个课程, ⼀个课程可以属于多个订单重点: 但是我们这⾥不着不过对订单表与课程表建⽴多对多的关系,⽽是通过订单详情表与课程表建⽴关系.订单详情表和课程表关系分析: ⼀对多订单详情是多的⼀⽅订单详情多的⼀⽅⼀个订单详情不可以属于多个课程, ⽽⼀个课程可以属于多个订单详情订单表和⽤户表关系分析: ⼀对多订单是多的⼀⽅⼀个⽤户可以下多个订单, ⼀个订单不能属于多个⽤户on_delete -> DO_NOTHINGdb_constraint=False提⽰: 不继承BaseModel表. is_show, orders没有必要存在3. 数据迁移'''<2>. order/models.py"""class Order(models.Model):# 主键、总⾦额、订单名、订单号、订单状态、创建时间、⽀付时间、流⽔号、⽀付⽅式、⽀付⼈(外键) - 优惠劵(外键,可为空)passclass OrderDetail(models.Model):# 订单号(外键)、商品(外键)、实价、成交价 - 商品数量pass"""from django.db import modelsfrom user.models import Userfrom course.models import Courseimport utilsclass Order(models.Model):"""订单模型"""status_choices = ((0, '未⽀付'),(1, '已⽀付'),(2, '已取消'),(3, '超时取消'),)pay_choices = ((1, '⽀付宝'),(2, '微信⽀付'),)subject = models.CharField(max_length=150, verbose_name="订单标题")total_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="订单总价", default=0)out_trade_no = models.CharField(max_length=64, verbose_name="订单号", unique=True)trade_no = models.CharField(max_length=64, null=True, verbose_name="流⽔号")order_status = models.SmallIntegerField(choices=status_choices, default=0, verbose_name="订单状态")pay_type = models.SmallIntegerField(choices=pay_choices, default=1, verbose_name="⽀付⽅式")pay_time = models.DateTimeField(null=True, verbose_name="⽀付时间")created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')updated_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')# 订单表和⽤户表关系分析: ⼀对多订单是多的⼀⽅⼀个⽤户可以下多个订单, ⼀个订单不能属于多个⽤户user = models.ForeignKey(User, related_name='order_user', on_delete=models.DO_NOTHING, db_constraint=False,verbose_name="下单⽤户")class Meta:db_table = "luffy_order"verbose_name = "订单记录"verbose_name_plural = "订单记录"def __str__(self):return "%s - ¥%s" % (self.subject, self.total_amount)@propertydef courses(self):data_list = []for item in self.order_courses.all():data_list.append({"id": item.id,"course_name": ,"real_price": item.real_price,})return data_listclass OrderDetail(models.Model):"""订单详情"""price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="课程原价")real_price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name="课程实价")# 订单和订单详情表关系分析: ⼀对多订单详情是多的⼀⽅⼀个订单可以有多个订单详情, ⼀个订单详情不可以同时属于多个订单.order = models.ForeignKey(Order, related_name='order_courses', on_delete=models.CASCADE, db_constraint=False,verbose_name="订单")# 订单详情表和课程表关系分析: ⼀对多订单详情是多的⼀⽅订单详情多的⼀⽅⼀个订单详情不可以属于多个课程, ⽽⼀个课程可以属于多个订单详情 '''订单表和课程表关系分析: 多对多⼀个订单可以包含多个课程, ⼀个课程可以属于多个订单重点: 但是我们这⾥不着不过对订单表与课程表建⽴多对多的关系,⽽是通过订单详情表与课程表建⽴关系.'''course = models.ForeignKey(Course, related_name='course_orders', on_delete=models.SET_NULL, null=True,db_constraint=False,verbose_name="课程")class Meta:db_table = "luffy_order_detail"verbose_name = "订单详情"verbose_name_plural = "订单详情"def __str__(self):"""str的健壮性校验"""try:return "%s的订单:%s" % (, self.order.out_trade_no)except Exception as e:utils.log.error(str(e))return super().__str__()2. 订单模块接⼝之⽀付接⼝<1>. 流程'''1. ⽀付接⼝: ⽣成订单, ⽣成⽀付连接, 返回⽀付连接1) 新建路由pay, payView2) 新建视图payVieworder表和orderdetail表插⼊数据, 重写create⽅法.⽣成订单号 uuid登录后才能⽀付 jwt认证当前登录⽤户就是下单⽤户, 存到order表中订单价格校验. 如: 下了三个课程, 总价格100, 前端提交的价格是99# 实现继承 C, G新建序列化类 OrderModelSeriailzer注意: 这是⼀个反序列化的表# 传输的数据格式{course: [1, 2, 3], total_amount: 100, subject: 商品名, pay_type: 1}# 控制字段fields=['total_amount', 'subject', 'pay_type', 'course_list']# 可以再局部钩⼦中把course=[1, 2, 3]⽣成course=[obj1, obj2, obj3] 或者使⽤ PrimayKeyRElatedFieldcourse=serialisers.CharField()# 校验1. 校验订单总价格: 获取总价格, 获取课程对象列表从总价格列表中获取每个价格叠加与总价格对⽐ (注意: 需要返回总价格)2. ⽣成订单号: str(uuid).replace('-', '')3. 获取⽀付⽤户: 视图中重写create⽅法借助self.context传将request对象传给序列化类4. ⽣成⽀付连接: 导⼊alipay, alipay_gateway. 拷贝, 将post, get2个回调的地址存放到配置⽂件中(配置到django的配置⽂件中), 拼接地址返回即可!5. ⼊库(订单, 订单详情): 将user对象存⼊attrs中, 把订单号存⼊attrs中, 将pay_url存⼊self.context中6. create⽅法. 先pop出课程列表对象, 存order表. for循环存⼊课程详情视图中: Response返回给前端的, 前端只需要⼀个连接, 那么序列化校验的第五步, 在self.context中将它存⼊, 将它返回给前端3) 配置jwt认证对PayView类进⾏限制. 使⽤内置限制(认证 + 权限)内置认证类: JSONWebTokenAUthentication内置权限类: isAuthenticated4) 序列化中让所有的fields中的字段必填. 有默认值的字段, 就不是必填的. required=True5) 出现错误: ⽀付宝⽀付的时候pay_total_amount是⼀个decimal类型, 需要转换成float类型. (提⽰: decimal累加可以)提⽰: ⽀付⽅式⽬前只写了⽀付宝的⽀付⽅式因此pay_type=1, 3个课程⼀起买⼀共1382. ⽀付宝异步回调的post接⼝: 验签, 修改订单状态3. 当⽀付宝get回调前端, vue组件⼀创建, ⽴马向后端你发⼀个get请求.(⽐较绕)'''<2>. order/views.pyfrom rest_framework.viewsets import GenericViewSetfrom rest_framework.mixins import CreateModelMixinfrom rest_framework import statusfrom rest_framework_jwt.authentication import JSONWebTokenAuthenticationfrom rest_framework.permissions import IsAuthenticatedimport utilsfrom . import modelsfrom . import serializerclass PayView(CreateModelMixin, GenericViewSet):# 对PayView类进⾏限制. 使⽤内置限制(认证 + 权限)authentication_classes = [JSONWebTokenAuthentication]permission_classes = [IsAuthenticated]queryset = models.Order.objects.all()serializer_class = serializer.OrderModelSeriailzerdef create(self, request, *args, **kwargs):# 视图中重写create⽅法借助self.context传将request对象传给序列化类serializer = self.get_serializer(data=request.data, context={'request': request})serializer.is_valid(raise_exception=True)self.perform_create(serializer)headers = self.get_success_headers(serializer.data)# 视图中: Response返回给前端的, 前端只需要⼀个连接, 那么序列化校验的第五步, 在self.context中将它存⼊, 将它返回给前端return utils.APIResponse(serializer.context['pay_link'], status=status.HTTP_201_CREATED, headers=headers)<3>. order/serializer.pyimport uuidfrom rest_framework import serializersfrom rest_framework.exceptions import ValidationErrorfrom django.conf import settingsfrom . import modelsfrom libs.alipay_sdk import alipay, alipay_gatewayclass OrderModelSeriailzer(serializers.ModelSerializer):# 可以再局部钩⼦中把course_list=[1, 2, 3]⽣成course_list=[obj1, obj2, obj3] 或者使⽤ PrimayKeyRElatedFieldcourse_list = serializers.PrimaryKeyRelatedField(write_only=True, many=True, queryset=models.Course.objects.all())class Meta:model = models.Orderfields = ['subject', 'total_amount', 'pay_type', 'course_list']extra_kwargs = {# 序列化中让所有的fields中的字段必填. 有默认值的字段, 就不是必填的. required=True'total_amount': {'required': True},'pay_type': {'required': True},}@staticmethoddef _verify_amount(attrs):total_amount = attrs.get('total_amount')course_list = attrs.get('course_list')course_amount = 0for course in course_list:course_amount += course.priceif course_amount == total_amount:return total_amountraise ValidationError("订单总价错误!")@staticmethoddef _order_number():return str(uuid.uuid1()).replace('-', '')def _pay_user(self):return self.context['request'].userdef _pay_link(self, out_trade_no, total_amount, subject):# print('total_amount:', total_amount, type(total_amount)) # total_amount: 138.00 <class 'decimal.Decimal'>order_string = alipay.api_alipay_trade_page_pay(out_trade_no=out_trade_no, # 订单号, 必须唯⼀# ⽀付宝⽀付的时候pay_total_amount是⼀个decimal类型, 需要转换成float类型. (提⽰: decimal累加可以)total_amount=float(total_amount), # 总⾦额subject=subject, # 订单标题return_url=settings.RETURN_URL, # 同步回调(⽀付成功)notify_url=settings.NOTIFY_URL # 异步回调(订单状态) 可选, 不填则使⽤默认notify url)return alipay_gateway + order_stringdef _before_create(self, attrs, out_trade_no, user, pay_link):attrs['out_trade_no'] = out_trade_noattrs['user'] = userself.context['pay_link'] = pay_linkdef validate(self, attrs):"""1. 校验订单总价格: 获取总价格, 获取课程对象列表从总价格列表中获取每个价格叠加与总价格对⽐ (注意: 需要返回总价格)2. ⽣成订单号: str(uuid).replace('-', '')3. 获取⽀付⽤户: 视图中重写create⽅法借助self.context传将request对象传给序列化类4. ⽣成⽀付连接: 导⼊alipay, alipay_gateway. 拷贝, 将post, get2个回调的地址存放到配置⽂件中(配置到django的配置⽂件中), 拼接地址返回即可!5. ⼊库(订单, 订单详情): 将user对象存⼊attrs中, 将pay_link存⼊self.context中"""# 1. 校验订单总价格total_amount = self._verify_amount(attrs)# 2. ⽣成订单号order_number = self._order_number()# 3. 获取⽀付⽤户user = self._pay_user()# 4. ⽣成⽀付连接pay_link = self._pay_link(out_trade_no=order_number, total_amount=total_amount, subject=attrs.get('subject'))# 5. ⼊库(订单, 订单详情)self._before_create(attrs=attrs, out_trade_no=order_number, user=user, pay_link=pay_link)return attrsdef create(self, validated_data):course_list = validated_data.pop('course_list')order = models.Order.objects.create(**validated_data)for course in course_list:models.OrderDetail.objects.create(course=course, price=course.price, real_price=course.price, order=order)return order<4>. settings/dev.py# 后台基URLBASE_URL = 'http://139.196.184.91'# 前台基URLLUFFY_URL = 'http://139.196.184.91'# ⽀付宝同步异步回调接⼝配置# 后台异步回调接⼝NOTIFY_URL = BASE_URL + "/order/success/"# 前台同步回调接⼝,没有 / 结尾RETURN_URL = LUFFY_URL + "/pay/success"<5>. luffyapi/urls.pypath('order/',include('order.urls')),<6>. order/urls.py⼦路由from django.urls import path, re_path, includefrom . import viewsfrom rest_framework.routers import SimpleRouterrouter = SimpleRouter()router.register('pay', views.PayView, 'pay')urlpatterns = [path('', include(router.urls)),]六、前台-⽀付⽣成页⾯1. 前端跳转到⽀付宝⽀付<1>. 流程'''提⽰: ⼀共三个地⽅都有⽴即购买操作1. FreeCourse.vue1) 定义buy_now()点击触发事件的⽅法从this.$cookies中获取token判断如果没有token那么触发this.$message发送ajax的post请求, this.$settings.base_url + /order/pay/, headers需要携带认证 Authorization, data需要携带对着数据. 使⽤另⼀种⽤法{}获取到pay_link, 前端发送get请求window.open(pay_link, '_self')2) 付款成功以后需要跳转到/order/success页⾯, 前端需要success组件. 后端需要success接⼝'''<2>. FreeCoourse.vue# template<span class="buy-now" @click="buy_now(course)">⽴即购买</span># scriptmethods: {buy_now(course) {// 获取token, 校验⽤户是否登录let token = this.$cookies.get('token');if (!token) {this.$message({message: "请先登录!",type: 'warning',});return false;}// 发送axiosthis.$axios({method: 'post',url: `${this.$settings.base_url}/order/pay/`,data: {"subject": ,// "total_amount": 11,"total_amount": course.price,"pay_type": 1,"course_list": [course.id,},headers: {Authorization: `jwt ${this.$cookies.get('token')}`},}).then(response => {console.log(response.data);if (response.data.code) {open(response.data.data, '_self');} else {this.$message({message: '订单处理失败!',type: 'warning',})}}).catch(error => {this.$message({message: "未知错误!",type: 'warning',})})},...}2. ⽀付成功前端页⾯<1>. 流程'''1. 新建PaySuccess.vue组件2. 配置路由 path: '/pay/success'注意: 回调以后会在你的url地址中, 携带者很多东西3. 拷贝PaySuccess页⾯提⽰: 页⾯只有⽀付宝回调回来才有数据, 直接查看是没有的4. create⾥⾯有⼀种特殊⽤法5. 同步回调参数trade_no ⽀付宝的流⽔号auth_app_id 商家流⽔号app_id 我们的id号页⾯需要的参数: 订单号, 交易号, 付款时间'''<2>. routere/index.jsimport PaySuccess from '../views/PaySuccess.vue'const routes = [...{path: '/pay/success',name: 'PaySuccess',component: PaySuccess},];<3>. ⽀付宝返回参数charset=utf-8&out_trade_no=7f7c7d12d57d45b693e1b49a6b01e1dd& # ⾃⼰的订单号method=alipay.trade.page.pay.return&total_amount=39.00&sign=FUmceqiNMWvxcD%2BUPCHiOTaEwlJ%2FXIXL5UwZWOSI1TwRjPIZVzjRLB4j2G5CQpn472JO8X%2BwMx04dHqjLxqLcY3TRu0XurQ%2FwKTNpyfDrtNuNv0rfGPuVHw52y3blbS7%2FKFVsWryw4%2BBuF2fCrJ4qWH8Zg14Rct7qoMbu73N trade_no=2020030722001464020500585462& # ⽀付宝的流⽔号auth_app_id=2016093000631831&version=1.0&app_id=2016093000631831&sign_type=RSA2&seller_id=2088102177958114×tamp=2020-03-07%2014%3A47%3A48 # 付款时间`// 同步回调没与订单状态<4>. views/PaySuccess.vue<template><div class="pay-success"><!--如果是单独的页⾯,就没必要展⽰导航栏(带有登录的⽤户)--><Header/><div class="main"><div class="title"><div class="success-tips"><p class="tips">您已成功购买 1 门课程!</p></div></div><div class="order-info"><p class="info"><b>订单号:</b><span>{{ result.out_trade_no }}</span></p><p class="info"><b>交易号:</b><span>{{ result.trade_no }}</span></p><p class="info"><b>付款时间:</b><span><span>{{ result.timestamp }}</span></span></p></div><div class="study"><span>⽴即学习</span></div></div></div></template><script>import Header from "@/components/Header"export default {name: "Success",data() {return {result: {},};},// console.log(location.search);// 解析⽀付宝回调的url参数let params = location.search.substring(1); // 去除? => a=1&b=2 let items = params.length ? params.split('&') : []; // ['a=1', 'b=2']//逐个将每⼀项添加到args对象中for (let i = 0; i < items.length; i++) { // 第⼀次循环a=1,第⼆次b=2 let k_v = items[i].split('='); // ['a', '1']//解码操作,因为查询字符串经过编码的if (k_v.length >= 2) {// url编码反解let k = decodeURIComponent(k_v[0]);this.result[k] = decodeURIComponent(k_v[1]);// 没有url编码反解// this.result[k_v[0]] = k_v[1];}}// 解析后的结果// console.log(this.result);// 把地址栏上⾯的⽀付结果,再get请求转发给后端this.$axios({url: this.$settings.base_url + '/order/success/' + location.search, method: 'get',}).then(response => {console.log(response.data);}).catch(() => {console.log('⽀付结果同步失败');})},components: {Header,}}</script><style scoped>.main {padding: 60px 0;margin: 0 auto;width: 1200px;background: #fff;}.main .title {display: flex;-ms-flex-align: center;align-items: center;padding: 25px 40px;border-bottom: 1px solid #f2f2f2;}.main .title .success-tips {box-sizing: border-box;}.title img {vertical-align: middle;width: 60px;height: 60px;margin-right: 40px;}.title .success-tips {box-sizing: border-box;}.title .tips {font-size: 26px;color: #000;}.info span {color: #ec6730;}.order-info {padding: 25px 48px;padding-bottom: 15px;border-bottom: 1px solid #f2f2f2;}.order-info p {display: -ms-flexbox;display: flex;margin-bottom: 10px;font-size: 16px;}.order-info p b {font-weight: 400;color: #9d9d9d;white-space: nowrap;}.study {padding: 25px 40px;}.study span {display: block;width: 140px;height: 42px;text-align: center;line-height: 42px;cursor: pointer;background: #ffc210;border-radius: 6px;font-size: 16px;color: #fff;}</style>七、后台-⽀付成功的备选接⼝1. 流程优化: 后端序列化中判断⽤户⽀付⾦额是否是0, 是0那么就直接修改订单状态, 也不⽤发送pay_link了# 前端: created分析1. localtion.search就可以获取⽀付好?号后⾯的参数获取到(包括问号), 使⽤.substring(1), 取出左边的?号2. 使⽤三元表达式, 对params进⾏split. 以及后⾯将这种参数进⾏处理3. decodeURICompontent,4. 把地址栏上⾯的⽀付结果, 再get请求发给后端this.$settings.base_url + '/order/success/' + localtion.search# 后端1. 路由: success/ SuccessView2. 视图: 继承APIView 因为不和序列化类有关系, 和数据库有点关系# get:获取前端传递过来的 out_trade_no, 去数据库中查取, 判断订单 order_status 的订单状态是否成功.最后返回响应中通过code=0或者code=1返回给前端即可# post: ⽀付宝回调回调地址: https:///fzlee/alipay/blob/master/README.zh-hans.md#alipay.fund.trans.toaccount.transfer回调参数: https:///open/270/105902/注意: 必须data内容返回 successrequest.data可能有2种情况. 如果是json格式是字典, 如果是QuseryDict需要注意失败了之后需要记录⽇志成功了之后需要记录⽇志, 并且修改订单状态, 使⽤ out_trade_no 作为过来标志, order_status 修改为1, 交易⽀付时间pay_time=gmt_payment'''2. 同步理论参数charset=utf-8&out_trade_no=7f7c7d12d57d45b693e1b49a6b01e1dd&method=alipay.trade.page.pay.return&total_amount=39.00&sign=FUmceqiNMWvxcD%2BUPCHiOTaEwlJ%2FXIXL5UwZWOSI1TwRjPIZVzjRLB4j2G5CQpn472JO8X%2BwMx04dHqjLxqLcY3TRu0XurQ%2FwKTNpyfDrtNuNv0rfGPuVHw52y3blbS7%2FKFVsWryw4%2BBuF2fCrJ4qWH8Zg14Rct7qoMbu73N trade_no=2020030722001464020500585462&auth_app_id=2016093000631831&version=1.0&app_id=2016093000631831&sign_type=RSA2&seller_id=2088102177958114×tamp=2020-03-07%2014%3A47%3A48`// 同步回调没与订单状态3. order/urls.pypath('success/',views.successView.as_view()),4. order/views.pyfrom rest_framework.views import APIViewfrom libs.alipay_sdk import alipayclass SuccessView(APIView):def get(self, request, *args, **kwargs):"""获取前端传递过来的 out_trade_no, 去数据库中查取, 判断订单 order_status 的订单状态是否成功.最后返回响应中通过code=0或者code=1返回给前端即可"""out_trade_no = request.query_params.get('out_trade_no')order = models.Order.objects.filter(out_trade_no=out_trade_no).first()# order.order_status值为1表⽰订单成功if order.order_status == 1:return utils.APIResponse()return utils.APIResponse(code=0, msg='失败')def post(self, request, *args, **kwargs):"""回调地址: https:///fzlee/alipay/blob/master/README.zh-hans.md#alipay.fund.trans.toaccount.transfer回调参数: https:///open/270/105902/注意: 必须data内容返回 successrequest.data可能有2种情况. 如果是json格式是字典, 如果是QuseryDict需要注意失败了之后需要记录⽇志成功了之后需要记录⽇志, 并且修改订单状态, 使⽤ out_trade_no 作为过来标志, order_status修改为1, 交易⽀付时间pay_time=gmt_payment"""# request.data类型判断data = request.data.dict()utils.log(f'data: {data}')signature = data.pop("sign")out_trade_no = data.get('out_trade_no')gmt_payment = data.get('gmt_payment')# 校验success = alipay.verify(data, signature)if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):# 修改订单状态models.Order.objects.filter(out_trade_no=out_trade_no).update(order_status=1, pay_time=gmt_payment)(f'{out_trade_no}订单⽀付成功!')# 注意: 服务器异步通知页⾯特性'''当商户收到服务器异步通知并打印出 success 时,服务器异步通知参数 notify_id 才会失效。
app交互设计案例App交互设计案例。
在当今移动互联网时代,App已经成为人们生活中不可或缺的一部分。
一个好的App不仅仅需要功能强大,还需要具有良好的交互设计,以提升用户体验。
本文将以几个经典的App交互设计案例为例,探讨其设计理念和实践经验。
首先,我们来看看支付宝的交互设计。
支付宝作为国内领先的移动支付平台,其交互设计堪称经典。
在支付宝App中,用户可以通过简单的手势操作完成转账、付款、理财等一系列操作,极大地提升了用户的操作效率。
同时,支付宝还采用了清晰明了的图标和文字提示,让用户在使用过程中不会感到迷茫。
此外,支付宝还注重用户的反馈体验,及时给予用户操作结果反馈,让用户能够清晰地知道自己的操作是否成功。
这些设计理念都使得支付宝在用户体验方面具有显著优势。
其次,我们来看看微信的交互设计。
作为中国最大的社交平台,微信的交互设计也是其成功的关键之一。
微信在设计上注重简洁直观,让用户可以快速找到自己需要的功能。
例如,微信的底部导航栏设计,让用户可以一目了然地找到消息、通讯录、发现等功能,极大地提升了用户的操作效率。
此外,微信还注重用户的个性化体验,提供了丰富的表情包、主题等个性化内容,让用户可以自由地表达自己。
这些设计理念让微信成为了用户首选的社交工具之一。
最后,我们来看看美团的交互设计。
美团作为国内知名的外卖、团购平台,其交互设计也是其成功的关键之一。
美团在设计上注重用户的操作便捷性,通过简单直观的界面和操作流程,让用户可以快速完成点餐、支付等操作。
同时,美团还注重用户的个性化推荐,根据用户的历史订单和偏好,为用户推荐个性化的商品和服务,提升了用户的购物体验。
这些设计理念让美团成为了用户首选的外卖、团购平台之一。
综上所述,好的App交互设计可以极大地提升用户体验,从而提升App的用户黏性和市场竞争力。
通过对支付宝、微信、美团等经典App的交互设计案例的分析,我们可以得出一些设计经验,简洁直观的界面设计、便捷高效的操作流程、个性化的用户体验等都是成功的关键。
1.1微信支付1.1.1JSAPI网页支付JSAPI网页支付即前文说的公众号支付,可在微信公众号、朋友圈、聊天会话中点击页面链接,或者用微信“扫一扫”扫描页面地址二维码在微信中打开商户HTML5页面,在页面内下单完成支付。
1.1.2Native原生支付Native原生支付即前文说的扫码支付,商户根据微信支付协议格式生成的二维码,用户通过微信“扫一扫”扫描二维码后即进入付款确认界面,输入密码即完成支付。
1.1.3接入方式微信支付系统是指完成微信支付流程中涉及的API接口、后台业务处理系统、账务系统、回调通知等系统的总称。
微信支付分为公众号支付,App支付,扫码支付(包括PC 网站),刷卡支付(设备扫描用户手机)本项目主要适用扫码支付。
接通扫码支付流程:用户扫描商户展示在各种场景的二维码进行支付。
步骤1:商户根据微信支付的规则,为不同商品生成不同的二维码,展示在各种场景,用于用户扫描购买。
步骤2:用户使用微信“扫一扫”扫描二维码后,获取商品支付信息,引导用户完成支付。
步骤(3):用户确认支付,输入支付密码。
步骤(4):支付完成后会提示用户支付成功,商户后台得到支付成功的通知,然后进行发货处理。
开发步骤:商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号)。
用户扫码后,微信支付系统将productid和用户唯一标识(openid)回调商户后台系统(需要设置支付回调URL),商户后台系统根据productid生成支付交易,最后微信支付系统发起用户支付流程。
商户支付回调URL设置指引:进入公众平台-->微信支付-->开发配置-->扫码支付-->修改1.1.4微信服务号支付申请一、需要注册服务号,并通过认证(认证需要300元),需要准备如下材料(如下材料包含商户功能需要的材料):1. 营业执照副本扫描成电子版图片(或者提供拍照,要求看清楚)2. 组织机构代码扫描成电子版图片(或者提供拍照,要求看清楚)3. 本人手持身份证清晰照片(请看附件中图例)4. 本人身份证扫描件(正反面)5. 授权运营书(企业微信公众号认证申请信息表或个体工商户申请认证函)6. 财付通结算银行证明函7. 税务登记证(国税)8. 公共号申请信息表(公司),具体表格网站上可下载,对应自己的经营性质。
AliPay支付宝标准快速付款接口文档V151副标题:网银直连修订历史说明:本接口将支付宝即时到帐接口用作纯网关的功能做详细介绍。
在集成时处理机制和原有支付宝即时到帐一样,要求时必须增加默认支付方式(paymethod)和默认网银(defaultbank)2个参数目录1前言------------------------------------------------------------------------------------------------------------- 3 1.1概述----------------------------------------------------------------------------------------------------------- 3 1.2术语----------------------------------------------------------------------------------------------------------- 3 2接口功能及参数介绍---------------------------------------------------------------------------------------- 32.1标准即时到账接口(适用于纯网银) --------------------------------------------------------------- 32.1.1功能描述 ------------------------------------------------------------------------------------------ 32.1.2交互流程 ------------------------------------------------------------------------------------------ 42.1.3交互模式 ------------------------------------------------------------------------------------------ 42.1.4接口详细说明 ------------------------------------------------------------------------------------ 42.1.5接口注意事项 ----------------------------------------------------------------------------------- 102.1.6接口错误代码列表 ----------------------------------------------------------------------------- 11 3签名通用策略------------------------------------------------------------------------------------------------ 133.1安全方面C HECK L IST ------------------------------------------------------------------------------------ 13 3.2签名方面 -------------------------------------------------------------------------------------------------- 133.2.1签名机制 ----------------------------------------------------------------------------------------- 133.2.24.2.2签名方式 ------------------------------------------------------------------------------------- 13 3.3其他方面 -------------------------------------------------------------------------------------------------- 134附录------------------------------------------------------------------------------------------------------------ 144.1接口通用机制 -------------------------------------------------------------------------------------------- 144.1.1系统调用 ----------------------------------------------------------------------------------------- 144.1.2页面跳转 ----------------------------------------------------------------------------------------- 144.1.3支付宝主动通知处理流程 -------------------------------------------------------------------- 164.1.4通知验证 ----------------------------------------------------------------------------------------- 16 4.2数字签名构造 -------------------------------------------------------------------------------------------- 184.2.1要求参数构造 ----------------------------------------------------------------------------------- 18 4.3公用枚举表 ----------------------------------------------------------------------------------------------- 214.3.1通知返回结果枚举 ----------------------------------------------------------------------------- 214.3.2通用交易状态枚举表 -------------------------------------------------------------------------- 214.3.1银行列表 ----------------------------------------------------------------------------------------- 224.3.2信用卡大额银行列表 -------------------------------------------------------------------------- 234.3.3订单状态列表 ----------------------------------------------------------------------------------- 23 4.4FAQ(常见问题的的解答)-------------------------------------------------------------------------- 241前言1.1概述本接口要紧用在外部集成网银直连(纯网关)功能1.2术语2接口功能及参数介绍2.1标准即时到账接口(适用于纯网银)2.1.1功能描述调用此接口,依照用户传过来的参数创建交易,买家再付款。
1支付宝的有关介绍1.1支付宝产生的背景由于电子商务中的商家与消费者之间的交易不是面对面进行的,而且物流与资金流在时间和空间上也是分离的,这种没有信用保证的信息不对称,导致了商家与消费者之间的博弈:商家不愿先发货,怕货发出后不能收回货款;消费者不愿先支付,担心支付后拿不到商品或商品质量得不到保证。
博弈的最终结果是双方都不愿意先冒险,网上购物无法进行。
第三方支付平台正是在商家与消费者之间建立了一个公共的、可以信任的中介。
它满足了电子商务中商家和消费者对信誉和安全的要求,它的出现和发展说明该方式具有市场发展的必然需求。
1.2支付宝的创立与发展:支付宝(中国)网络技术有限公司是国内领先的独立第三方支付平台,是阿里巴巴集团的关联公司。
支付宝致力于为中国电子商务提供“简单、安全、快速”的在线支付解决方案。
作为中国主流的第三方网上支付平台,支付宝不仅从产品上确保用户在线支付的安全,同时致力于让用户通过支付宝在网络间建立信任的关系,去帮助建设更纯净的互联网环境。
支付宝提出的建立信任,化繁为简,以技术创新带动信用体系完善的理念,深得人心。
支付宝2003年10月诞生于淘宝网,推出担保交易模式;2004年12 月,支付宝平台独立,支付宝公司开始运营;2005年3月推出“你敢付,我敢赔”全额赔付机制;截至2012年12月,支付宝日交易额峰值超过200亿元人民币,日交易笔数峰值达到1亿零580万笔。
1.3支付宝覆盖范围支付宝创新的产品技术、独特的理念及庞大的用户群吸引越来越多的商家和合作伙伴选择支付宝作为自己的在线支付解决方案。
目前除淘宝和阿里巴巴外,有超过46万的商家和合作伙伴支持支付宝的在线支付和无线支付服务,范围涵盖了B2C购物、航旅机票、生活服务、理财、公益等众多方面。
这些商家在享受支付宝服务的同时,也同时拥有了一个极具潜力的消费市场。
1.3支付宝的特点(1)安全担保交易,货到付款,确保买卖双方货款都安全;三大安全法宝-支付宝实名认证,数字证书,手机动态密码提升账户安全;128位SSL 加密传输技术,确保交易信息的安全;风险控制系统24小时运作,做到事前防范,事中控制与事后处理相结合;订单管理与资金进出分权限管理,保障账户操作安全;全国唯一一家在工商银行进行资金托管的第三方支付公司,确保您的资金安全。
交互界面案例在当今数字化时代,交互界面设计已经成为各种应用程序和网站的重要组成部分。
一个优秀的交互界面可以提升用户体验,增强用户对产品的好感度,甚至影响产品的市场竞争力。
因此,设计师们需要不断地探索和创新,以满足用户不断变化的需求。
下面,我们将通过几个案例来探讨优秀的交互界面设计是如何实现的。
案例一,谷歌地图。
谷歌地图是一个被广泛使用的地图应用程序,其交互界面设计简洁而强大。
在搜索地点时,用户只需在搜索框中输入目的地的名称,地图会自动定位并显示相关信息。
用户可以通过手势缩放地图,查看不同比例尺下的地理信息。
此外,谷歌地图还提供了实时交通信息、步行导航、公交线路等功能,让用户可以方便地获取所需信息。
这些功能的设计使得用户可以在使用地图时得到快速、准确的反馈,极大地提升了用户体验。
案例二,支付宝。
作为一款移动支付应用程序,支付宝的交互界面设计十分人性化。
在支付过程中,用户只需打开应用,选择扫一扫功能,对准二维码即可完成支付。
同时,支付宝还提供了账单查询、转账、理财等功能,用户可以在一个应用中完成多种金融操作。
此外,支付宝还通过个性化推荐和活动页面,增加了用户的粘性,让用户在使用支付宝时感到更加便捷和愉快。
案例三,微信。
作为一款社交应用程序,微信的交互界面设计非常注重用户的社交体验。
用户可以通过微信发送文字、图片、语音、视频等多种形式的信息,与好友进行实时互动。
在微信的界面设计中,各种功能按钮的布局合理,操作简单直观,让用户可以快速找到所需功能。
此外,微信还提供了朋友圈、公众号、小程序等功能,让用户可以在一个应用中完成各种社交活动。
这种设计使得用户可以轻松地与朋友进行交流,分享生活,增强用户对微信的粘性。
综上所述,优秀的交互界面设计应该具有简洁直观、功能丰富、用户体验良好等特点。
设计师们需要不断地关注用户的需求,不断地优化界面设计,以提升产品的竞争力。
希望以上案例能够给大家带来一些启发,帮助大家设计出更加优秀的交互界面。
⽀付宝移动⽀付之IOSApp调⽤⽀付宝钱包近期客户提出要开发⼀个IOS上的app作为訪问他们站点的途径之中的⼀个。
为什么说之中的⼀个呢。
因为眼下PC和Mobile这两个站眼下都已经上线了。
所以问题就简单了,我们仅仅须要把mobile站UI改动⼀下,然后在依据客户的新需求改动下程序,之后把这个站套个IOS的壳⼦就能够了。
那么问题来了,我们的mobile⽀付的时候调⽤的是⽀付宝的⽹页⽀付,这个页⾯是⽀付宝的,我们没办法改动,所以假设套在壳⼦⾥继续使⽤这样的⽀付⽅式会有点不伦不类的感觉。
所以我们就决定调⽤⽀付宝钱包,也就是⽀付宝client。
下⾯是我參考⽀付宝移动⽀付⽂档整理出来的⼀些资料:1. ⾸先要调⽤⽀付宝钱包你必须你登录商户的⽀付宝账户的“签约管理”⾥⾯去申请签约开通“移动⽀付”2. PID和密钥管理⽀付宝提供商户接⼝产品时,会⾃主提供⼀个保障商户接⼊安全的⼀组信息及其相应的配置平台。
这组信息就是密钥。
由商户密钥与⽀付宝密钥交换后与⽀付宝商户标识(如partnerID、APPID等)绑定。
合作伙伴密钥使⽤合作伙伴密钥的典型功能包含:快捷登录、移动⽀付、即时到账收款、⼿机站点⽀付等。
查看PID和密钥查看PID查看MD5(Key)查看RSA商户公钥与⽀付宝公钥查看DSA商户公钥与⽀付宝公钥上传公钥上传RSA公钥上传DSA公钥密钥⽣成RSA私钥及公钥⽣成DSA私钥及公钥⽣成这块流程能够让你上层领导来处理。
这⾥的相关操作都要在商户⽀付宝账户中操作。
3. 我们来看⼀下我们开发⼈员须要care的点①交互流程:功能流程流程说明(以Android平台为例):第2步:调⽤⽀付接⼝:此消息就是本接⼝所描写叙述的开发包提供的⽀付对象PayTask,将商户订单信息传进pay⽅法唤起⽀付宝收银台,订单格式详细參见“请求參数说明”。
第3步:⼿机⽀付宝⽀付开发包将会依照商户App提供的參数发送⽀付请求。
第5步:异步发送⽀付通知:⼿机⽀付宝⽀付server端发送异步通知消息给商户server端,參见“server异步通知參数说明”。
⽀付宝⽀付(三)—APP⽀付(alipay.trade.app.pay) ⾸先,郑重的说明⼀下,本⼈是纯服务端开发⼈员,不懂安卓和ios开发,在实际开发配合中,也只负责给安卓和ios的同事提供服务端调取的接⼝以及处理⽀付宝的异步回调。
所以这篇⽂章只是介绍服务端的开发过程,不会涉及到安卓和ios客户端的处理过程,如果你只想了解客户端处理过程,可以不⽤往下看了,goodbye 在看这篇⽂章之前,希望你先看上⼀篇⽂章,涉及到的部分准备⼯作这⾥就不再重复了,有疑问的看上⼀篇⽂章或者查阅官⽅⽂档。
⼀、APP⽀付产品介绍 APP⽀付适⽤于商家在 App 应⽤中集成⽀付宝⽀付功能。
商家APP调⽤⽀付宝提供的 SDK,SDK 再调⽤⽀付宝APP内的⽀付模块。
注意:如果⽤户已安装⽀付宝 APP,商家 APP 会跳转到⽀付宝中完成⽀付,⽀付完后跳回到商家APP内,最后展⽰⽀付结果。
如果⽤户没有安装⽀付宝 APP,商家 APP 内会调起⽀付宝⽹页⽀付收银台,⽤户登录⽀付宝账户,⽀付完后展⽰⽀付结果。
⽬前⽀持⼿机系统有:iOS(苹果)、Android(安卓)。
1、应⽤场景(1)⽤户已安装⽀付宝⽀付流程 步骤1:⽤户在商家 App 中选择商品下单、确认购买,进⼊⽀付环节,选择⽀付宝,⽤户点击确认⽀付,如图1; 步骤2:进⼊到⽀付宝页⾯,调起⽀付宝⽀付,出现确认⽀付界⾯,如图2; 步骤3:⽤户确认收款⽅和⾦额,点击⽴即⽀付后出现输⼊密码界⾯,如图3; 步骤4:输⼊正确密码后,⽀付宝端显⽰⽀付结果,如图 4; 5.⾃动回跳到商家 App 中,商家根据付款结果个性化展⽰订单处理结果,如图 5。
(2)⽤户未安装⽀付宝⽀付流程 步骤1:⽤户在商家 App 中选择商品下单、确认购买,进⼊⽀付环节,选择⽀付宝,⽤户点击确认⽀付,如图 6; 步骤2:⽤户未安装⽀付宝客户端,则调起⽀付宝⽹页⽀付收银台,⽤户登录⽀付宝账户,如图 7; 步骤3:登录成功后,进⼊确认付款页⾯,如图 8; 步骤4:⽤户点击确认付款,进⼊⽀付密码页⾯,如下图 9; 5.⽤户输⼊密码,完成⽀付,展⽰⽀付结果,如图 10。
第三方支付的解决方案—以支付宝为例篇一:第三方支付会计处理网络购物等电子商务的发展,带动了电子交易量的不断攀升,使得第三方支付平台被广泛地应用。
但会计准则并未针对该业务领域制定会计处理方法,这成了会计准则的空白区。
本文以支付宝为例,进行第三方支付平台相关业务账务处理的探讨。
之所以选择支付宝,是因为它是目前我国交易规模最大的、最具代表性的独立第三方支付平台,并且其交易流程是人们最熟悉的。
一、第三方支付平台的运营模式第三方支付平台是独立于消费者和商家的营运商,也是交易资金代收代付的中介。
它与各大银行签约,建立深入的战略合作关系,并与银行支付结算系统对接,为电子交易中的买卖双方提供资金支付的中转站。
在一个理想的支付系统里,资金的支付转移与相应的账务处理是同步的,即从付款方的贷方转入收款方的借方。
但是在第三方支付系统中,由于存在延时交付或延时清算,资金的支付和账务处理是不同步的。
买方先将货款支付到第三方支付平台,卖方发货并且由买方确认收货后,第三方支付平台再将货款汇转到卖方的账户。
在这个过程中,资金不能及时地由买方账户流转到卖方账户,因此出现了资金在第三方支付平台的沉淀。
下面以支付宝的交易流程为例,简要描述独立第三方支付平台的运营模式。
首先,买方在淘宝网上购买商品,并通过网上银行等方式向支付宝公司的账户支付相应的的款项,交易由此产生。
其次,卖方收到订单后,一般在1 ~ 3天内向买方发货。
最后,买方收到商品并在淘宝网上点击“确认收货”后,支付宝会将款项支付给卖方,此时交易结束。
二、虚拟账户概述在第三方支付平台,进行资金流转的载体是虚拟账户?它是第三方支付平台提供给买卖双方的交易账户。
虚拟账户分为两类。
一类存在于企业集团内部,以集团的银行账户为依托,将企业内部的网络平台与银行提供的系统相对接,企业集团为子公司、内部部门或项目设立子虚拟账户,并可通过网上银行对这些子虚拟账户进行转账、查询等操作。
还有一类是第三方支付虚拟账户,是第三方支付平台为客户提供的网上交易账户。
调用支付宝接口的流程调用支付宝接口是一项常见的电子商务应用开发操作,它可以帮助我们完成支付功能。
下面是一个简要的调用支付宝接口的流程,让我们来详细了解一下吧。
一、申请开发者账号在调用支付宝接口之前,我们首先需要申请一个开发者账号。
我们需要打开支付宝开放平台的网站,点击右上角的“免费注册”按钮,然后按照提示完成注册即可获得开发者账号。
二、调用API接口在申请开发者账号之后,我们就可以开始调用支付宝接口了。
我们需要在支付宝开放平台上找到相应的API接口文档,根据文档的要求进行调用。
一般来说,我们需要注册一个应用程序,获得AppID和AppSecret,然后使用该信息进行接口调用。
三、构建请求参数在开始调用API接口之前,我们还需要构建请求参数。
支付宝接口通常会对请求参数的格式和内容进行要求,我们需要按照文档的要求进行构建。
比如,对于支付接口,我们需要提供订单信息、支付方式、付款金额等必要信息。
四、发送请求并处理响应完成请求参数构建之后,我们就可以发送请求了。
我们需要将请求参数以指定格式发送给支付宝接口。
一般来说,我们需要使用HTTPS协议进行发送以保证数据的安全性。
完成请求发送之后,我们需要处理支付宝接口返回的响应数据。
一般来说,我们需要对响应数据进行解析,以便了解支付结果是否成功。
同时,我们还需要进行错误处理,以便及时发现和修复错误。
五、完成支付流程在处理响应数据之后,我们需要根据支付结果来完成支付流程。
如果支付成功,我们需要将用户跳转到支付成功页面,并对订单状态进行更新。
如果支付失败,我们需要提示用户支付失败,并提供重新支付的选项。
以上就是调用支付宝接口的简要流程。
通过该流程,我们可以完成一次支付操作,并保证支付过程的安全性和用户体验。
当然,具体的调用流程和接口参数要求可能会有所不同,我们需要根据不同的支付场景进行具体的开发和调试。
支付宝扫码支付超时处理逻辑支付宝扫码支付超时处理逻辑1. 背景介绍在如今的数字化时代,移动支付已经成为人们生活中必不可少的一部分。
支付宝作为国内最具影响力的移动支付平台之一,在为用户提供方便快捷的支付体验的也不断优化其支付过程和交易逻辑。
其中,支付宝扫码支付是一种广泛使用的支付方式,用户只需打开支付宝扫描商家的付款码,即可快速完成支付。
然而,在实际使用中,有时候会遇到扫码支付超时的情况,那么支付宝又是如何处理这种情况的呢?2. 扫码支付超时原因分析支付宝扫码支付超时可能涉及多个因素,包括但不限于网络延迟、设备问题、商户端系统问题等。
在用户扫描付款码后,支付宝客户端与商户服务器之间会进行数据交互,包括支付金额、订单信息等。
如果在这个过程中出现了延迟或错误,就可能导致支付超时。
3. 支付宝扫码支付超时处理逻辑对于扫码支付超时,支付宝平台会根据具体情况作出相应处理,并为用户提供多种选择。
以下是支付宝扫码支付超时处理逻辑的简要介绍:3.1 超时查询当用户扫描付款码后,在支付宝客户端会进行一定时间范围内的支付过程。
如果超过了设定的时间,支付宝会自动触发超时查询,这时用户可以选择等待一段时间,让系统继续查询支付状态。
3.2 支付成功确认如果查询支付状态后显示支付成功,支付宝会向用户展示支付成功的页面,并通知商户端支付已成功,用户可以继续购物或离开。
3.3 重新支付如果查询支付状态后显示支付失败或未知状态,支付宝会向用户提供重新支付的选项。
用户可以选择重新扫描付款码,重新进行支付操作。
3.4 退款申请如果用户确认支付失败后,可以选择申请退款。
支付宝会根据用户的申请进行退款处理,将支付款项退回到用户的支付账户。
4. 个人观点和理解支付宝扫码支付超时处理逻辑的设计充分考虑了用户的需求和支付体验。
通过超时查询、支付成功确认、重新支付和退款申请等方式,用户可以根据实际情况选择最合适的操作。
这种处理逻辑的灵活性和多样性,既保证了用户支付过程的顺利进行,同时也为用户提供了一种安全和放心的支付方式。
支付系统详解(下篇):收付款能力收付款能力是支付机构最基础的能力。
支付机构之所以可以提供收付款的能力,是因为其拿到了支付牌照(可以进行资金结算),以及银行或者清算机构提供的收付款接口(备付金集中存管后,银行接口已经关闭),从而可以自行包装各种支付形式,如担保支付、认证支付、二维码支付等。
但归根到底,银行或者清算机构提供的就是“收付款”三个字所代表的收款和付款的能力,其中收款的体现形式为网银、代扣、快捷支付,付款就是指代付。
一、网银支付最初大多数用户使用的支付形式就是网银支付,网银支付需要用户事先将银行卡开通网银支付功能,才能够在支付的时候使用。
网银支付的表现形式为:用户在商城购物,支付时跳转到银行网银页面,输入银行卡信息并验证取款密码完成支付。
(支付完成后,可以点击一下银行页面中的返回商家按钮,因为如果存在某些异常导致银行不能成功后台通知到支付机构,而你又直接关掉了这个支付成功页面的话,就会造成掉单)支付机构网银支付的关键过程(仅限于支付机构与渠道侧的交互流程):支付机构组织网银报文(报文要具备完整性、不可抵赖性)发送到渠道侧;渠道侧直接跳转到选定的银行网银页面(也可能是跳转到渠道侧之后,还可以再选择银行);用户在银行网银页面输入卡号、取款密码、短信验证码等信息,确认支付;支付成功后,点击一下支付成功页面的返回商户按钮,这时支付成功的信息就会通知到支付机构,这就叫做前台通知;银行通知支付机构,还有一种是后台通知,就是通过系统接口之间的对接,将支付成功结果通知到支付机构,一般都是支付成功的才通知,其他状态视具体情况而定。
由于网银后台通知一般次数有限(3次),通知成功一次即停止通知,所以为了避免支付机构因为网络问题等异常情况没能获取到支付结果,支付机构应对接渠道提供的订单查询接口,在订单进行支付的一段时间后,自动发起查询(其实这一步可有可无,但是管理后台要有订单状态查询的功能),补正订单的状态。
二、代扣代扣是基于用户与服务方(商户/支付机构/银行)签订的协议,得到用户的授权,服务方可向指定账户扣除指定款项的业务,正常都是一次签约无需鉴权。
支付宝通讯需求说明
节点配置流程图
图1
SWHTTPSS 侦听节点:服务端,主要负责接收支付宝发起的请求。
DEF1 流程1:用于配置收到请求报文后的交易流程。
SWHTTPSC 侦听节点:客户端,主要负责向支付宝发起交易请求。
DEF2 流程2:用于配置发起请求报文后的交易流程。
支付宝发起请求报文:
1.支付宝请求(来帐)处理流程(同步方式):
(1)支付宝请求1到SWHTTPSS节点,报文调度发送报文2至DEF1。
(2)DEF1流程调用原子交易进行业务处理3返回SWHTTPSS节点,DEF1流程结束。
(3)SWHTTPSS节点4返回应答给支付宝,完成应答。
2.支付宝批量查询请求(来帐)处理流程(异步方式):
(1)支付宝请求1到SWHTTPSS节点,报文调度2使用DEF1流程处理。
(2)DEF1流程调用原子交易进行业务处理(组接收报文)3返回SWHTTPSS 节点。
(3)DEF1处理完成后发批量查询指令5到DEF2流程,DEF1流程结束。
(4)DEF2流程调用原子交易(结果通知报文)1发送到SWHTTPSC节点.
(5)SWHTTPSC节点向支付宝发送通知请求报文2,等待支付宝应答。
(6)支付宝发送接受报文3到SWHTTPSC。
(7)SWTCPSC节点收到支付宝应答后4报文调度发送至DEF2。
(8)DEF2流程调用原子交易进行交易处理,流程结束。
平台发起请求报文:
1.平台发起清算通知报文处理流程(同步方式):
(1)DEF2流程中调用原子交易,组成清算文件和清算通知报文。
(2)DEF2报文调度1发送至SWHTTPSC节点。
(3)SWHTTPSC判断文件标志,如果有文件需要发送,先向支付宝发送文件。
(4)文件发送完成后,发送文件通知报文,同步等待支付宝发送接收报文3。
(5)SWHTTPSC收到应答报文后,转发报文4至DEF2。
(6)DEF2流程调用原子交易进行业务处理,结束流程。
3.文件传送相关说明:
(1)如果报文中有文件需要传输,业务处理中会设置文件标志,变量名暂定如下,可以调整:
$fileflag 文件标志(1 有文件0无文件)
$filename 文件名称(文件的绝对路径)
$url_suf URL后缀(有文件时需要一个签名后的URL后缀)(2)URL说明:
支付宝文件服务器的URL格式如下:
http://172.27.16.2/file/$url_suf
其中:172.27.16.2可以从侦听SWHTTPSC的配置中获取,$url_suf则在
业务中设置。
注意:
文件传送完成后,需要发送清算文件通知报文,报文中访问的URL和前面批量查询结果通知报文的URL一致。