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

随心笔谈2年前发布 admin
174 0 0

文章摘要

这篇文章描述了一个基于Ping++认证的支付回调处理逻辑。代码首先检查请求中是否带有有效的Ping++签名信息,如果缺少则返回401错误。接着,它读取请求体数据并验证签名,随后根据验证结果处理支付成功或退款事件。对于成功事件,代码更新订单状态并返回200或500的状态码;对于退款事件,同样更新订单状态并处理相关操作。如果验证失败或请求错误,则返回403错误。整个逻辑通过JSON事件处理支付和退款通知,并通过返回状态码和错误日志来确保系统的健壮性。


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

© 版权声明

相关文章