侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

技术  /  管理员 发布于 6年前   457

本地数据库创建订单表。

建议包含以下字段,参考官方API( https://pingxx.com/document/api#api-c-new):

order_no:required

  商户订单号,适配每个渠道对此参数的要求,必须在商户系统内唯一。  alipay: 1-64 位,  wx: 1-32 位,  bfb: 1-20 位,  upacp: 8-40 位,  yeepay_wap:1-50 位,  jdpay_wap:1-30 位,  cnp_u:8-20 位,  cnp_f:8-20 位,  推荐使用 8-20 位,要求数字或字母,不允许特殊字符

app[id]:required

 支付使用的 app 对象的 id,请登陆管理平台查看。

subject:required

  商品的标题,该参数最长为 32 个 Unicode 字符,  银联全渠道(upacp/upacp_wap)限制在 32 个字节。

body:required

 商品的描述信息,该参数最长为 128 个 Unicode 字符, yeepay_wap 对于该参数长度限制为 100 个 Unicode 字符。

channel:required

 支付使用的第三方支付渠道(更多请参考api)  alipay:支付宝手机支付  alipay_wap:支付宝手机网页支付  alipay_qr:支付宝扫码支付  alipay_pc_direct:支付宝 PC 网页支付  apple_pay:Apple Pay  bfb:百度钱包移动快捷支付  bfb_wap:百度钱包手机网页支付     wx:微信支付  wx_pub:微信公众账号支付  wx_pub_qr:微信公众账号扫码支付  jdpay_wap:京东手机网页支付

amount: required

 订单总金额, 单位为对应币种的最小货币单位, 例如:人民币为分(如订单总金额为 1 元,此处请填 100)。

client_ip: required

  发起支付请求终端的 IP 地址,格式为 IPV4,如: 127.0.0.1。

      
以上是在ping++ 平台创建订单时需要的参数

以下是在ping++ 平台创建订单成功以及付款成功回调的参数

paid :支付状态,默认为falserefunded :退款状态,默认为falsetime_paid :付款时间time_refunded:退款时间charge_no:返回的charge编号transaction_no :交易号

步骤:

1.本地创建一条订单记录

 def create_order

 #获取参数   #判断参数合法性   order = Order.new #保存订单信息,注意subject以及body的长度 #生成订单号并保存 order_no = (Time.now.to_formatted_s(:number)).to_s 6.times{ order_no<<rand(10).to_s } order.order_no = order_no #获取ip并保存 order.client_ip = request.remote_ip  if order.save  #返回成功信息 else  render_failure(order.errors.messages.first[1][0]) end end

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


  • 上一条:
    ruby元编程之创建自己的动态方法
    下一条:
    Ruby的运算符和语句优先级介绍
  • 昵称:

    邮箱:

    1条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    • 2025-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客