#by zcq100
require 'md5'
require "openssl"
module Payment::Cmb::Cmbpay
# merchantid 商家编号
#
# posid 商户柜台代码
#
#branchid 分行代码
#
#orderid 由商户提供的订单号码,最长30位,按实际长度给出
#
#payment 由商户提供,最长30位,按实际长度给出
#
#curcode 交易币种,默认01(人民币)
#
#txcode 由建行统一分配为690401(企业账户)520100(个体账户)
#
#remark1 网银不处理,直接传到城综网
#
#remark2 网银不处理,直接传到城综网
#
#个体商户的url可以直接GET请求提交参数,如果是企业商户参数必须POST提交
def pay(merchantid,posid,branchid,orderid,payment,curcode="01",txcode="520100",remark1="",remark2="")
#参考发送的url
#https://ibsbjstar.ccb.com.cn/app/ccbMain?MERCHANTID=123456789&POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&TXCODE=520100&REMARK1=&REMARK2=&MAC=qwertyuioplkjhgfdsazxcvbnm901234
baseurl="https://ibsbjstar.ccb.com.cn/app/ccbMain"
p=Hash.new
p[:MERCHANTID]=merchantid
p[:POSID]=posid
p[:BRANCHID]=branchid
p[:ORDERID]=orderid
p[:PAYMENT]=payment
p[:CURCODE]=curcode
p[:TXCODE]=txcode
p[:REMARK1]=remark1
p[:REMARK2]=remark2
#得到签名,签名是根据url和参数直接md5加密
p[:MAC]=sign p
url=baseurl+"?"+p.to_query()
end
#商家签名
def sign params
MD5.hexdigest(params.to_query())
end
#根据银行返回的签名检查url是否被篡改
def check_sign url
public_key="这里是公匙"
enctype=url.slice(url.rindex("&")+6,url.length);
str=url.slice(0,url.rindex("&"))
enctype_str=rsa_public_encrypt(str,public_key)
if enctype==enctype_str
return true
else
p "签名校验非法"
return false
end
end
#用公匙RSA签名参数
def rsa_public_encrypt(value , public_key)
rsa = OpenSSL::PKey::RSA.new(public_key)
rsa.public_encrypt(value)
end
end