Ruby on Rails在Ping ++ 平台实现支付


当前第2页 返回上一页

现在ping++ 平台创建一条记录
1.在order.rb文件中新建一个方法

 def pay_url
  #获取api_key以及app_id
  Pingpp.api_key = PingPlusPlus.get_ping_settings["PING_API_KEY"]
  app_id = PingPlusPlus.get_ping_settings["PING_APP_ID"]
  #不同支付渠道的回调地址
  case self.channel
    when "alipay"
    extra = {
   }
    when "wx"
    extra = {
   } 
   end
  #ping++平台新建一个订单
  begin
   charge = Pingpp::Charge.create(
     :order_no => self.order_no,
     :app  => { :id => app_id },
     :channel => self.channel,
     :amount => self.amount.round(2) * 100.to_i,
     :client_ip => self.client_ip,
     :currency => "cny",
     :subject => self.subject[0..31],
     :body  => self.body[0..127],
     :extra  => extra
     )
   
   return charge
  rescue Pingpp::PingppError => error
    logger.error 'ping++平台创建订单失败'
    logger.error error.http_body
    return false
  end
 end

2.调用pay_url方法创建订单,返回给客户端charge对象,客户端拿着charge对象去ping++ 平台支付

 def confirm_and_payment
  order_no = params[:order_no]
  channel = params[:channel]
  if order_no.blank? || channel.blank?
   render_failure("参数不完整!") and return
  end
 
  order = Order.where(order_no: order_no).first
  if order.blank?
    render_failure("订单不存在!")and return
  end

  charge = order.pay_url
  if charge == false
   render_failure("订单支付失败!") and return
  else
   order.update_attribute(:charge_no ,(JSON.parse charge.to_s)['id'])
   render(:json => charge)
  end
 end

异步通知更新付款结果

 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

更多ECSHOP内容来自木庄网络博客


标签:ECSHOP

返回前面的内容

相关阅读 >>

ECSHOP 同步ucenter,一步登陆discuzx

微信小程序如何获取用户收货地址

php的优点总结 php有哪些优点

iis6.0+tomcat7.0整合总结(推荐)

常用linux命令收集整理

支付宝支付开发——当面付条码支付和扫码支付实例

php 无限级分类

mysql建立高效的索引实例分析

分享微信扫码支付开发遇到问题及解决方案-附ECSHOP微信支付插件

ECSHOP商品搜索页显示商品货号的方法

更多相关阅读请进入《ECSHOP》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...