module Cpay::Sand::Fastpay

Public Instance Methods

notify(c_params) click to toggle source
# File lib/cpay.rb, line 98
def notify(c_params)
  sign = c_params[:sign]
  data = c_params[:data]
  publickey = c_params[:publickey]
  ret = {
      code: -1,
      msg: '',
      data: {}
  }
  begin
    if Utils.rsa_verify(data, sign, publickey)
      data = JSON data
      ret[:data] = data
      ret[:code] = 0

      ret[:cpay] = {
          ok: data['body']['orderStatus'] == '1',
          msg: '',
          next: data['head']['respCode'] != '000000',
      }
    else
      ret[:code] = 2
    end
  rescue Exception => ex
    ret[:msg] = ex.to_s
    ret[:code] = -1
  end
  ret
end
pay(c_params) click to toggle source
# File lib/cpay.rb, line 62
def pay(c_params)
  time = Time.now.strftime('%Y%m%d%H%M%S')
  b_params = {
      body: {
          userId: c_params[:userid].to_s, #用户ID
          orderCode: c_params[:orderid].to_s, #订单号
          orderTime: time,
          totalAmount: c_params[:amount].to_s.rjust(12, '0'), #订单金额
          subject: c_params[:subject].to_s, #订单标题
          body: c_params[:body].to_s, #订单描述
          currencyCode: 156,
          notifyUrl: c_params[:notifyurl].to_s, #异步通知地址
          frontUrl: c_params[:fronturl].to_s, #前端跳转地址
      },
      method: "sandPay.fastPay.quickPay.index"
  }
  res = base_pay_act b_params, c_params, true

  if res[:code] = 0
    return %Q{
<form action="https://cashier.sandpay.com.cn/fastPay/quickPay/index" method="post" hidden="hidden">
<textarea name="charset">#{res[:data][:charset]}</textarea>
<textarea name="signType">#{res[:data][:signType]}</textarea>
<textarea name="data">#{res[:data][:data]}</textarea>
<textarea name="sign">#{res[:data][:sign]}</textarea>
</form>
<script type="text/javascript">
  document.forms[0].submit();
</script>
}
  else
    return "生成订单失败,请稍后重试"
  end

end
queryOrder(c_params) click to toggle source
# File lib/cpay.rb, line 128
def queryOrder(c_params)
  b_params = {
      body: {
          orderCode: c_params[:orderid].to_s, #订单号
      },
      method: "sandpay.trade.query",
      uri: URI("https://cashier.sandpay.com.cn/gateway/api/order/query")

  }
  ret = base_pay_act b_params, c_params, false
  ret[:cpay] = {
      next: ret[:data]['head']['respCode'] == '030096',
      ok: ret[:data]['body']['oriRespCode'] == '000000' && ret[:data]['body']['orderStatus'] == '00',
      msg: ret[:data]['oriRespMsg']
  }
  ret
end

Private Instance Methods

base_pay_act(b_params, c_params, return_req_data) click to toggle source
# File lib/cpay.rb, line 148
def base_pay_act(b_params, c_params, return_req_data)
  ret = {
      code: -1,
      msg: '',
      data: {}
  }
  begin
    time = Time.now.strftime('%Y%m%d%H%M%S')
    data = {
        head: {
            version: '1.0',
            method: b_params[:method],
            productId: '00000016',
            accessType: '1',
            mid: c_params[:mid].to_s,
            channelType: '07',
            reqTime: time
        },
        body: b_params[:body]
    }

    req_data = {
        charset: 'utf-8',
        signType: '01',
        data: data.to_json,
        sign: Utils.rsa_sign(data.to_json, c_params[:privatekey])
    }

    if return_req_data
      ret[:code] = 0
      ret[:data] = req_data
    else
      res = Net::HTTP.post_form b_params[:uri], req_data

      puts res.body
      cgi_parse = CGI.parse(Utils.url_decode(res.body))
      unless Utils.rsa_verify(cgi_parse['data'][0], cgi_parse['sign'][0].to_s.gsub(' ', '+'), c_params[:publickey])
        ret[:code] = 2
        ret[:msg] = "签名错误"
      else
        ret[:code] = 0
        ret[:data] = JSON(cgi_parse['data'][0])
      end
    end
  rescue Exception => ex
    ret[:msg] = ex.to_s
    ret[:code] = -1
  end
  ret
end