正文

Ruby on Rails在Ping ++ 平台实现支付(ruby 教程)燃爆了

文章摘要

这篇文章描述了一种基于Rails的支付回调处理逻辑,主要功能如下: 1. **验证请求来源**:首先检查请求头中的`x-pingplusplus-signature`是否为空,如果是空则返回401错误。 2. **提取和验证签名**:读取请求体中的数据,提取并验证`x-pingplusplus-signature`的值,判断请求来源是否合法。 3. **处理成功回调**: - 如果是支付成功回调,读取订单号并查询订单记录,更新支付状态,设置状态码为200或500(根据订单是否保存成功)。 - 如果是退款成功回调,同样读取订单号并更新退款时间,设置状态码为200或500。 4. **错误处理**:对未知操作或无效签名的情况记录日志并返回403错误。 总结而言,这篇文章通过ping++回调机制实现了支付和退款操作的异步通知处理,确保了交易的完整性和安全性。

 def notify status=400 #判断请求是否有ping++的签名信息 if request.headers[‘x-pingplusplus-signature’].blank? status=401 logger.debug ‘【报哪家】:======付款回调请求来源错误!!!!!’ return end #获取签名信息 raw_data=request.body.read if request.headers[‘x-pingplusplus-signature’].is_a?(Array) signature=request.headers[‘x-pingplusplus-signature’][0].to_s else signature=request.headers[‘x-pingplusplus-signature’].to_s end # 获取「Webhooks 验证 Ping++ 公钥」 pub_key_path=”#{Rails.root}/config/rsa_public_key.pem” if verify_signature(raw_data, signature, pub_key_path) #处理接收的结果 event=JSON.parse(raw_data) #付款成功 if event[“type”]==’charge.succeeded’ # 开发者在此处加入对支付异步通知的处理代码 order_no=event[‘data’][‘object’][‘order_no’] order=Order.where(order_no: order_no).first order_from=order.status if order.present? #更新字段 order.paid=event[‘data’][‘object’][‘paid’] if order.save status=200 else status=500 end else logger.debug ‘数据库没有该条记录!’ end #退款成功 elsif event[‘type’]==’refund.succeeded’ # 开发者在此处加入对退款异步通知的处理代码 order_no=event[‘data’][‘object’][‘order_no’] order=Order.where(order_no: order_no).first if order.present? #更新字段 order.time_refunded=Time.at(event[‘data’][‘object’][‘time_succeed’]) if order.save status=200 else status=500 end else logger.debug ‘数据库没有该条记录!’ end else logger.debug ‘付款回调返回未知操作!’ end else logger.debug ‘付款回调请求来源错误!’ status=403 end render :nothing=> true, :status=> status end