分享
  1. 首页
  2. 文章

Golang 对接宝付、通联、富友金账户...填坑记

KendoCross · · 5966 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一、宝付私钥加密,公钥解密

由于对RSA加密解密原理不是很熟悉,宝付也没有Golang的Demo提供。Go语言库里一般都是私钥解密、公钥加密,或者私钥签名、公钥验签。宝付需要反过来,这里也到好找到了https://github.com/farmerx/gorsa的实现,但始终宝付那边提示签名验证失败。然后就继续找其他的实现了,这就惨了各种Google完全无解。最后回过头来只能,使用加解密原文,跟.Net平台的结果进行比对。一通折腾或者叫折磨之后,发现其实只是每次加密多了117个字节的全是0,后面的加密结果居然是跟其他平台一样的。由此对armerxgorsa做了如下修改,成功。

这个前后花了3天时间。虽然解决问题的方式最终很简单,但是找到这条路的过程可真是披荆斩棘。

二、通联密钥解析

宝付的密钥直接使用Go语言包就可以解析了,但是通联的就棘手了。给出的P12文件是Windows下的,继续Bing。好在很快就有了结果,当然还是最大同性交流平台https://github.com/ikaiguang/go-allinpay。虽然参考代码有了,不过还是遇到麻烦事。让朋友Mac电脑上密钥转换出来的pem文件总是解析失败,1.2K,比能解析的大一些。

这个时候想起来Win10包含Linux子系统了,之前已经安装过,但还没怎么玩过。刚好可以尝试下。操作依然很微软——生产力平台。1.WIndows功能里启用2.Win10应用商城里搜索Ubuntu,安装即可。3.直接使用Linux 子系统做一些事情啦!

找到待转换密钥所在路径,执行以下命令。

openssl pkcs12 -nocerts -nodes -in 20060400000491004.p12 -out 20060400000491004.pem
openssl x509 -inform DER -in allinpay-pdsDev.cer -out allinpay-pdsDev.pem

三、富友金账户密钥

有前面这些个坑,基本上平的差不多之后,对支付平台的加解密基本熟悉了,然后对接金账户就轻松多了。简单的尝试了一下,密钥。最终直接使用Java版本的即可,只不过私钥使用PKCS1解析,公钥使用PKIXPublicKey进行解析。

func init() {
 carFile, err := ioutil.ReadFile("Assets/prkey.key")
 if err != nil {
 return
 }
 pemBlock, _ := pem.Decode(carFile)
 if pemBlock == nil {
 return
 }
 parsedKey, err := x509.ParsePKCS1PrivateKey(pemBlock.Bytes)
 if err != nil {
 return
 }
 jzhSignaKey = parsedKey
 verify, err := ioutil.ReadFile("Assets/pbkey.key")
 if err != nil {
 return
 }
 block, _ := pem.Decode(verify)
 if block == nil {
 return
 }
 pub, err := x509.ParsePKIXPublicKey(block.Bytes)
 if err != nil {
 return
 }
 jzhVerfyKey = pub.(*rsa.PublicKey)
}

四、获取XML中的子内容

基本上加解密趟完之后,其他的都是小问题了。熟悉Golang的基本库就可以了。从富友返回的XML里截取出验签所需的明文,很是怀念大.Net 的优良封装。一个方法就好了,起初也想照着这个套路来找Golang的实现,貌似Golang里的XML解析,不借助其他第三方库的情况下,主要就两种1.解析为Struct;2.不知道XML实际内容按XML基本属性解析。

最后使用正则表达式,截取的。

var plainTxt=xmlDoc.Element("plain")?.ToString(SaveOptions.DisableFormatting)

五、业务接口对接

其他就剩下主要业务接口的具体对接实现了。主要示例如下:完成了金账户的注册、宝付的裸扣、通联快捷代扣。代码开源在 https://github.com/KendoCross/KendoPay 上,未来打算继续完善和对接易宝等其他各大支付平台。

package kendopay
import (
 "fmt"
 "testing"
 "time"
)
//金账户注册
func TestJzhReg(t *testing.T) {
 jzhRegInfo := JzhRegister{
 CstmNM: "王道",
 CertifTP: "0",
 CertifID: "612429198812220777",
 MobileNo: "13410100777", // 手机号码
 CityID: "5840", // 开户行地区
 BankID: "113", //银行
 BankNm: "深圳支行", //支行名称
 ActNo: "6230580000144090777", //账户
 Remark: "胡乱备注", //备注
 }
 Register(jzhRegInfo)
 fmt.Println("---------------------金账户注册------------------------------------------")
 fmt.Println()
}
//通联快捷支付
func TestTLQuickPay(t *testing.T) {
 // 请求参数
 fastTrx := QuickTradeReqFASTTRX{
 BUSINESS_CODE: "19900", // 业务代码
 SUBMIT_TIME: time.Now().Format("20060102150405"), // 提交时间(YYYYMMDDHHMMSS)
 AGRMNO: "AIP9549180803000001424", // 协议号(签约时返回的协议号)
 ACCOUNT_NO: "6214850219949549", // 账号(借记卡或信用卡)
 ACCOUNT_NAME: "幸福", // 账号名(借记卡或信用卡上的所有人姓名)
 AMOUNT: "12345", // 金额(整数,单位分)
 CURRENCY: "CNY", // 货币类型(人民币:CNY, 港元:HKD,美元:USD。不填时,默认为人民币)
 ID_TYPE: "0", // 开户证件类型(0身份证,1户口簿,2护照,3军官证,4士兵证...)
 ID: "370613198705308692", // 证件号
 TEL: "18689262774", // 手机号
 CUST_USERID: "github.com/ikaiguang", // 自定义用户号(商户自定义的用户号,开发人员可当作备注字段使用)
 SUMMARY: "交易附言", // 交易附言(填入网银的交易备注)
 REMARK: "不备注", // 备注(供商户填入参考信息)
 }
 result, err := Allinpay.Collect(fastTrx)
 if err != nil {
 fmt.Printf("%#v \n", err)
 }
 fmt.Println(result)
 fmt.Println("---------------------通联快捷支付------------------------------------------")
 fmt.Println()
}
//宝付裸扣
func TestBFBareCollect(t *testing.T) {
 Baofoo.BareCollect()
 fmt.Println("---------------------宝付裸扣------------------------------------------")
 fmt.Println()
}

有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:KendoCross

查看原文:Golang 对接宝付、通联、富友金账户...填坑记

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
5966 次点击 ∙ 1 赞
3 回复 | 直到 2018年08月06日 21:24:43
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏