微信支付逻辑?
1、顾客选择商品
2、顾客选到心怡的商品找店员结算
3、店员拿着顾客交给他的商品生成预付单(后台服务器调微信生成预付单的API)
4、店员获得预付单后,签上自己的名字(业绩提成用)交给顾客,让顾客拿着单子去付款
5、顾客拿着预付单去找微信收款机,那么问题来了。a、用户不会用收款机(开发者帮助顾客傻瓜化操作) b、收款机不知顾客拿的单子对不对(开发者要审核和修改顾客的单子)
6、微信收款机校验预付单没有错,于是弹出密码框让顾客付款
7、付款结果异步反馈到店员和顾客
店员(后台服务器)将用户选择的商品转变成预付单的全过程?
1、店员上传appId,appScrect,partnerId,appkey验证身份,当微信收款机返回token时,就表明店员开的预付单有效,token有效多久,开设的预付单就有效期多久
2、现在店员输入商品的所有属性拼接成原始的预付单字符串,这些属性包括预付单金额,预付单标题,预付单支付成功后的回调网址,商户的工商局编号PartnerID,预付单的流水编号等等
3、店员在这串预付单字符串上签上自己的名字sign进行签名认证(本质上是将这个字符串转变成微信收款机可以识别,类似于MD5加密)
4、将店员已经签完名的预付单上传到微信收款机返回给顾客一个预付单的唯一编号perpayID
5、客户端就是顾客拿着这个perpayID拼接partnerId,package,nonceStr,timeStamp,sign并签名认证之后使用微信收款机结账
开发者所要做的事情?
1、使得顾客能够傻瓜化地一键使用微信收款机,只需点击确认支付键就可以上传预付单到微信收款机
2、顾客手里的预付单是信息不全的,需要开发者对已经签完名的预付单进一步处理,让微信收款机对预付单的验证能一次通过
3、当微信收款机校验预付单无误之后,让顾客输入密码掏钱
4、微信收款机收到钱后会返回枯燥的文字提醒,开发者把这种提示夸张放大让顾客接收起来更加清晰优雅
开发者正确使用微信收款机SDK的方法?
1、使用任何大型软件之前,都需要填写唯一注册码,当然微信收款机的AppID是去注册应用时自动获得的
2、扩展的移动支付功能需要启动微信APP,因此需要给封闭的自身应用添加允许外部访问的白名单URL Schemes
3、从后台服务器拿回预付单(店员签过名的预付单)再次进行签名,不过需要注意的是,不是在原有的预付单上补充添加,而是通过PayReq实例化一个新的卡片型预付单,解析原预付单,卡片上总共需要填写的属性有:partnerId,prepayId,package,nonceStr,timeStamp,sign
4、卡片提交到微信收款机[WXApi sendReq:request]
5、通过onResp:(BaseResp*)resp接收微信收款机的处理结果,如果resp对象已经是PayResp,自然分析errCode属性和errStr属性
支付宝个人账户与企业账户的区别?
1、支付宝个人账户和公司账户都可以提现,不需要交税
2、个人用户,1-2个工作日即可到账,可以通过个人的银行卡进行提现
3、公司用户,公司名称注册,只能提现到以公司名义开具的银行账号,除工商银行1-2个工作日到账以外,其他银行账户需2-5个工作日到账
4、公司用户才有条件申请加入淘宝商城,个人用户不能加入淘宝商城
5、公司用户加入商城后,需要给买家开具销售发票,涉及积分使用的还要给淘宝开具发票
6、支付宝注册之后不可以将个人类型账户改成公司类型账户
7、个人用户,提供我的支付宝、消费记录、安全中心、生活助手、联系人、消费计划管理、财务管理、帮助中心等服务。
8、公司用户提供财务管理、资金结算、多操作员、多账户、授权管理、审核流程、集团账户业务与账务明细查询及下载、母子公司账户余额查询、单笔/批量代发/代扣、内外资金转账调拨等服务
9、企业类型的支付宝账户是以的支付宝账户,如果需要提现
将商户的私钥转变成PKCS8格式?
1、终端OpenSSL
2、genrsa -out rsa_private_key.pem 1024
3、pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
合作者身份PartnerID?
合作者身份ID(PID)是商户与支付宝签约后,商户获得的支付宝商户唯一识别码。当商户把支付宝功能接入商户网站时会用到PID,以便让支付宝认证商户
P++创建应用会获取到的信息?
1、APPID
2、私钥,私钥又回分为测试和正式
3、公钥,当然类似支付宝那种,好长好长
Ping++的SDK通过CocoaPods接入后在infoPlist文件中的URL Type添加URL Schemes的意义?
本身应用封闭,但是A应用需要B应用的功能,于是跳转,实现的唯一方式就是设置URL Schemes,目的是使用[[UIApplacation shareApplication] openUrl :[NSUrl urlWithString:@"你的Schemes//"];方法来通过其他程序打开了设置了schemes的程序,比如我要打开微信,你的Schemes就是微信平台上注册的应用程序的 id号。如果不填写URL Schemes会造成用户付款成功后打不开原来的应用
支付流程?
用户确认支付信息、App发送支付要素到App服务器、App服务器发送支付请求到P++服务器、P++服务器返回APP服务器支付凭据再呈现到App上、用户根据支付凭据选择支付渠道付款、相应的支付渠道返回支付结果
为什么Ping++服务器要返回App服务器支付凭据然后再返回支付凭据到APP呈现给用户?
相当于现实中的发票收据,而且必须是JSON格式,告诉用户下单成功,可以支付;只有当App获取到支付凭据才可以调起支付控件
支付渠道同步返回支付结果和异步返回支付结果区别?
同步就是直接将支付结果返回到App;异步就是先将支付结果返回到P++服务器,然后返回到App服务器,再返回到App,现在P++已经推出了Webhooks来更替原有的异步通知系统。可以就特定的事件结果(通常就是交易结果和退款结果)推送到指定的地址。
设置支付结果反馈为异步有什么意义?
让服务器对订单的数据进行统计,包括交易额,交易量、流失率,从而使用三方管理工具进行管理和大数据分析,就是为了便于客户系统或者第三方系统能够处理客户的交易信息。
服务器获取得支付要素后如何与P++服务器通信?
客户端需要安装P++的客户端,同样APP服务区也需要安装P++的服务器端
既然APP客户端不需要直接与P++服务器进行通信,那为什么是需要P++客户端?
一是因为P++客户端只是一个支付渠道的集合;二是因为只有P++客户端才可以与P++服务器端进行通信
创建支付渠道的时候设置回调网址的作用?
就是App在用户点击确认支付之后将支付渠道返回的支付结果呈现在设定的页面路径地址上
通常App服务器端要向P++服务器发起支付请求,需要P++服务器端携带哪些参数?
订单号、支付金额、appID(验证是否已在P++服务器创建账号 )、支付渠道(方便统计,况且不同渠道需要的参数有所不同)、客户Id(验证这个客户有没有钱)等
客户端从服务器端获得支付对象charge之后如何处理?
通过Pingpp这个类直接调用createPayment方法,输入参数包括支付对象、视图控制器、用于跳转支付渠道APP的URL SCheme,后面再接一个处理结果的回调Block。
支付凭据包括哪些内容?上传支付要素获得支付凭据之后又怎么办?
Pingpp调用类方法createPayment,输入参数支付字典和自身应用的url Schemes,同时还拥有一个包含支付结果字符串、支付错误的Block回调。22
APP服务器向P++服务器发出的请求中包括哪些支付要素?
1、post请求:http://115.29.102.93:8080/qiuqiu/payments
2、订单号:orderNo
3、查看用户IP:clientIP
4、价钱:amount
5、支付渠道:channel
退款流程?
1、客户端App向App服务器端发送退款申请
2、App服务器调用P++服务器端向P++服务器发起退款请求
3、P++服务器向APP服务器返回退款对象,再接着P++向app服务器返回退款结果
4、客户端根据app服务器更新退款状态或进度
什么叫退款对象?
支付和退款本质都是数据在服务器和客户端之间经进行通信,那么数据如何携带,就是通过实例化的一个对象,然后给对象里的属性进行赋值,支付时的对象是Charges,退款时的对象则是refund,典型的服务器如何对客户app端或app服务器的请求进行反馈,解决方案就是通过返回数据模型对象,支付凭据对象Charges,退款对象refund
P++服务器对于不同的支付渠道的退款对象refund有所不同?
1、支付宝的退款对象包含一个字典属性,键status值pending表示待定状态,键failure_msg的值存储了一个让用户输入支付密码并点击确认的链接;
2、微信的退款对象会因为当初用户是选择零钱支付还是选择使用银行卡支付而有所不同。如果当初是零钱支付,又要分为微信升级与否,没升级前,无需输入支付密码直接退款到零钱,升级后的微信退款到零钱,流程跟支付宝类似,退款状态先是待定,直到用户输入支付密码并点击确认才可以退款成功,如果是退回到银行卡则退款状态一直是待定,直到微信完成退款到银行卡。
退款状态的判断方式?
1、通过退款对象的键值对来判断,但是有纰漏,就是这个判断必须是在App服务器向P++服务器返回状态反馈之后
2、通过监听和接受Webhooks这个通知来进行判断
App服务器向P++服务器发送查询订单的请求需要客户端传给APP服务器哪些参数?
1、单笔查询需要订单号
2、列表查询需要user_Id
3、支付查询使用charge支付对象作参数
4、退款查询使用refund退款对象作参数
微信或或支付宝等支付渠道和Ping++的关系?
申请的支付渠道参数必须与Ping++管理平台上配置的参数一致。否则报错:支付渠道的权限检查失败
支付平台成功后操作?
1.支付平台成功后一般有两种回调方式,一种是你说的notify_url,这个是支付平台成功后直接进行页面调转的地址
2.除了第1种方式以外,支付平台一般还提供直接后台通知的方式adviceURL(名字每个平台各有不同),意思就是支付平台成功后,会通过后台直接调用你的某个响应页面,进行完成支付结果回馈操作,这个是纯后台操作,和用户的前端界面没有任何关系
3.有了以上两种形式,你的页面就可以根据实际情况编写响应了嘛
注意事项?
1、Ping++的SDK通过CocoaPods接入后在 Build Settings 搜索 Other Linker Flags,添加 -ObjC
2、在调用支付渠道之前需要先判断用户手机是否安装,这在Xcode7和iOS9之后需要设置infoPlist
3、正式环境关闭测试模式,[Pingpp setDebugMode:NO]
APP服务器如何将P++服务器返回的支付凭据Charges对象转变成JSON字符串格式返回给客户端?而且为什么必须需要支付凭据对象才可以调起支付渠道?
在P++服务器向APP服务器返回退款对象Refund且根据键值对判断退款成功之后,为什么APP服务器一定要向P++服务器返回服务器状态码200进行状态反馈?
服务器监听并通过在P++管理平台填写的通知地址接收Webhooks 通知?