ruby 支付宝接口

alipay支付宝(ruby实现)

 

require 'iconv'
require 'net/http'
require 'uri'
#Alipay(支付宝)库文件
# ===使用方法如下:
# * alipay_uri = Alipay::Merchant.new do |m|
# * m.return_url = 'hello'
# * m.show_url='http://www.baidu.com'
# * m.subject = 'goodsName'
# * m.body = 'theBodyOfTheGoods'
# * m.out_trade_no = '20091009143121'
# * m.price = 20.34
# * m.quantity = 4
# * end.uri
module Alipay
  class Merchant
    GATEWAY='http://www.alipay.com/cooperate/gateway.do'
    NOTIFY_HTTP_VERIFY ='http://notify.alipay.com/trade/notify_query.do'
    NOTIFY_HTTPS_VERIFY ='https://www.alipay.com/cooperate/gateway.do'
    TRANSPORT ='http'
    SIGN_TYPE ='MD5'
    INPUT_CHARSET='UTF-8'
    KEY='pojyh234234234234234234qp4jeoz' # 密码
    CONFIG = {
            :service=>'create_direct_pay_by_user',
            :partner=>'208232342349770', # partner_id
            :payment_type=>'1',
            :paymethod=>'bankPay',
            :defaultbank=>'SDB',
            :seller_email=>'example@example.com', # partner_email 卖家email
            :seller_id=>'',
            :it_b_pay=>'',
            :royalty_type=>'',
            :royalty_parameters=>'',
            }
    ATTRIBUTES=[:notify_url, :return_url, :show_url, :subject, :body, :out_trade_no, :price, :total_fee, :quantity, :buyer_email, :buyer_id]
    ARGUMENTS =CONFIG.keys + ATTRIBUTES
    attr_accessor *ATTRIBUTES

    def initialize(options={}, & block)
      options.each { |attr, value| instance_eval "self.#{attr}='#{value}'" }
      yield(self)
    end

    #购买商品的URI
    def uri
      options = parameters
      type, sign = sign(SIGN_TYPE, options)
      "#{GATEWAY}?%s&sign=#{sign}&sign_type=#{type}" % options.map { |k, v| k.to_s + '=' +v.to_s }.join('&')
    end

    #验证通知的正确性
    def self.notify_verify(options={})
      notify_url = URI.parse("#{NOTIFY_HTTP_VERIFY}?partner=#{CONFIG[:partner]}&notify_id=#{options[:notify_id]}")
      {"true"=>true, "false"=>false}[Net::HTTP.get(notify_url)]
    end

    private
    #sanitize the parameters
    def parameters
      configs=ARGUMENTS-ATTRIBUTES
      @params=CONFIG.dup.delete_if { |k, v| !configs.include?(k) }
      ATTRIBUTES.each do |a|
        @params.merge!(a => send(a))
      end
      @params.store(:_input_charset, INPUT_CHARSET)
      @params.delete_if { |k, v| v.nil? || v=="" }
    end

    #请求参数按照参数名字符升序排列,如果有重复参数名,那么重复的参数再按照参数值的字符升序排列
    #所有参数(除了sign和sign_type)按照上面的排序用&连接起来,格式是:p1=v1&p2=v2
    def sign(sign_type, options={})
      type = sign_type.to_s.upcase
      if type.eql?('md5')
        key = options.sort { |k1, k2| k1.to_s<=>k2.to_s }.map { |k, v| k.to_s + '=' + v.to_s }.join('&')
        return type, Digest::MD5.hexdigest(key+Alipay::Merchant::KEY)
      else
        raise "unimplement other algorithm!"
      end
    end
  end
end
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,下面是一个简单的Ruby接口案例: ```ruby require 'sinatra' # GET请求的接口 get '/api/hello' do content_type :json { message: 'Hello, World!' }.to_json end # POST请求的接口 post '/api/greet' do content_type :json name = params[:name] { message: "Hello, #{name}!" }.to_json end # PUT请求的接口 put '/api/update/:id' do content_type :json id = params[:id] # 执行更新操作... { message: "Record with ID #{id} has been updated." }.to_json end # DELETE请求的接口 delete '/api/delete/:id' do content_type :json id = params[:id] # 执行删除操作... { message: "Record with ID #{id} has been deleted." }.to_json end ``` 上述例子使用了Sinatra框架,它是一个轻量级的Ruby Web框架,适合快速搭建简单的接口。在上面的代码中,我们定义了四个不同的路由,分别对应不同的HTTP请求方法(GET、POST、PUT、DELETE)。 对于GET请求的`/api/hello`接口,它返回一个JSON格式的响应,包含一条简单的问候消息。 对于POST请求的`/api/greet`接口,它从请求参数中获取名字,并返回一个包含问候消息的JSON响应。 对于PUT请求的`/api/update/:id`接口,它从URL参数中获取ID,并执行相应的更新操作,然后返回一个JSON响应。 对于DELETE请求的`/api/delete/:id`接口,它从URL参数中获取ID,并执行相应的删除操作,然后返回一个JSON响应。 以上只是一个简单的示例,实际的接口可能涉及更复杂的逻辑和数据处理。但这个例子可以帮助你了解如何使用Ruby构建一个简单的接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值