第三方支付是指具备一定实力和信誉保障的独立机构,采用与各大银行签约的方式,通过与银行支付结算系统接口对接而促成交易双方进行交易的网络支付模式。
通俗的例子:
支付宝,微信支付,百度钱包,PayPal(主要是欧美国家)
拉卡拉(中国最大线下便民金融服务提供商)
优点:
1、支付平台降低了政府、企业、事业单位直连银行的成本,满足了企业专注发展在线业务的收付要求。
2、使用方便。对支付者而言,他所面对的是友好的界面,不必考虑背后复杂的技术操作过程
缺点:
1、风险问题,在电子支付流程中,资金都会在第三方支付服务商处滞留即出现所谓的资金沉淀,如缺乏有效的流动性管理,则可能存在资金安全和支付的风险
2、电子支付经营资格的认知、保护和发展问题
聚合支付:
聚合支付是相对之前的第三方支付而言的,作为对第三方支付平台服务的拓展,第三方支付是介于银行和商户之间的,而聚合支付是介于第三方支付和商户之间
出现的场景:
一堆第三方支付出现,并通过大量的钱补贴线上商家使用它们的支付,导致商户收银台堆满各种POS机器,扫码设备,商户还需要去各家支付公司申请账号,结算等
解决的问题:聚合支付公司提供的二维码,支付多种方式支付,不再是一种,各个公司的竞争,就是支付渠道和方式的支持
1、什么是微信商户平台: 地址:https://pay.weixin.qq.com 提供给商家使用,用于查看交易数据,提现等信息 2、常用的支付方式 公众号支付,扫码支付,app支付,小程序支付 官方地址:https://pay.weixin.qq.com/wiki/doc/api/index.html 案例演示: https://pay.weixin.qq.com/guide/webbased_payment.shtml 3、微信支付申请流程 https://pay.weixin.qq.com/guide/qrcode_payment.shtml 1)申请公众号(服务号) 认证费 300 2)开通微信支付
微信网页扫码支付:
1、扫码支付文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=2_2
2、名称理解
appid:公众号唯一标识
appsecret:公众号的秘钥
mch_id:商户号,申请微信支付的时候分配的
key:支付交易过程生成签名的秘钥,设置路径
微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全-->密钥设置
3、和微信支付交互方式
1、post方式提交
2、xml格式的协议
3、签名算法MD5
4、交互业务规则 先判断协议字段返回,再判断业务返回,最后判断交易状态
5、接口交易单位为 分
6、交易类型:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
7、商户订单号规则:
商户支付的订单号由商户自定义生成,仅支持使用字母、数字、中划线-、下划线_、竖线|、星号*这些英文半角字符的组合,请勿使用汉字或全角等特殊字符,微信支付要求商户订单号保持唯一性
8、安全规范:
签名算法:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3
校验工具:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1
9、采用微信支付扫码模式二(不依赖商户平台设置回调url)
(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。
时序图包括四个元素 对象(Object), 生命线(Lifeline), 激活(Activation), 消息(Message);
对象:时序图中的对象在交互中扮演的角色就是对象,使用矩形将对象名称包含起来, 名称下有下划线
生命线:生命线是一条垂直的虚线, 这条虚线表示对象的存在, 在时序图中, 每个对象都有生命线
激活:代表时序图中对象执行一项操作的时期, 表示该对象被占用以完成某个任务,当对象处于激活时期, 生命线可以拓宽为矩形
消息:对象之间的交互是通过相互发消息来实现的,箭头上面标出消息名,一个对象可以请求(要求)另一个对象做某件事件
消息从源对象指向目标对象,消息一旦发送便将控制从源对象转移到目标对象,息的阅读顺序是严格自上而下的
消息交互中的实线:请求消息
消息交互中的虚线:响应返回消息
自己调用自己的方法:反身消息
统一下单接口:
商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易会话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
订单接口CRUD
1、Dao层VideoOrder增删改查开发
public interface VideoOrderMapper {
/**
* 保存订单,返回包含主键
* @param videoOrder
* @return
*/
@Insert("insert into video_order (openid,out_trade_no,state,create_time,notify_time,total_fee,nickname,head_img,video_id,video_title,video_img,user_id,ip,del) "+
"values"+"(#{openid},#{outTradeNo},#{state},#{createTime},#{notifyTime},#{totalFee},#{nickname},#{headImg},#{videoId},#{videoTitle},#{videoImg},#{userId},#{ip},#{del})")
@Options(useGeneratedKeys = true,keyProperty = "id",keyColumn = "id")
int insert(VideoOrder videoOrder);
@Select("select * from video_order where id=#{order_id} and del=0")
VideoOrder findById(@Param("order_id") int id);
/**
* 根据交易订单号获取订单
* @param outTradeNo
* @return
*/
@Select("select * from video_order where outTradeNo=#{outTradeNo} and del=0")
VideoOrder findByoutTradeNo(String outTradeNo);
@Select("select * from video_order where user_id=#{userId}")
List<VideoOrder> findMyOrderList(int userId);
/**
* 根据id号和userId进行删除操作
* 只是逻辑上的删除
* 当参数多于2个时要加@Param
* @param id
* @param userId
* @return
*/
@Update("update video_order set del=0 where id=#{id} and user_id=#{userId}")
int del(@Param("id") int id,@Param("userId") int userId);
/**
* 根据订单流水号进行更新
* @param videoOrder
* @return
*/
@Update("update video_order set state=#{state} ,notify_time=#{notifyTime}, openid=#{openid} " +
"where out_trade_no=#{outTradeNo} and del=0 and state=0")
int updateViderOrderByoutTradeNo(VideoOrder videoOrder);
}