Golang 对接宝付、通联、富友金账户...填坑记
一、宝付私钥加密,公钥解密
由于对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 .p12 -out .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: "",
CertifID: "",
MobileNo: "", // 手机号码
CityID: "", // 开户行地区
BankID: "", //银行
BankNm: "深圳支行", //支行名称
ActNo: "", //账户
Remark: "胡乱备注", //备注
} Register(jzhRegInfo)
fmt.Println("---------------------金账户注册------------------------------------------")
fmt.Println()
} //通联快捷支付
func TestTLQuickPay(t *testing.T) { // 请求参数
fastTrx := QuickTradeReqFASTTRX{
BUSINESS_CODE: "", // 业务代码
SUBMIT_TIME: time.Now().Format(""), // 提交时间(YYYYMMDDHHMMSS)
AGRMNO: "AIP9549180803000001424", // 协议号(签约时返回的协议号)
ACCOUNT_NO: "", // 账号(借记卡或信用卡)
ACCOUNT_NAME: "幸福", // 账号名(借记卡或信用卡上的所有人姓名)
AMOUNT: "", // 金额(整数,单位分)
CURRENCY: "CNY", // 货币类型(人民币:CNY, 港元:HKD,美元:USD。不填时,默认为人民币)
ID_TYPE: "", // 开户证件类型(0身份证,1户口簿,2护照,3军官证,4士兵证...)
ID: "", // 证件号
TEL: "", // 手机号
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()
}
Golang 对接宝付、通联、富友金账户...填坑记的更多相关文章
- golang对接阿里云私有Bucket上传图片、授权访问图片
golang对接阿里云私有Bucket上传图片.授权访问图片 1.为什么要设置私有bucket 公共读写:互联网上任何用户都可以对该 Bucket 内的文件进行访问,并且向该 Bucket 写入数据. ...
- 高通AR和友盟SDK的AndroidManifest.xml合并
高通AR和友盟SDK的AndroidManifest.xml合并 因为高通的AR在android中一开始就要启动,所有主Activity要设置为高通的Activity,即android:name=&q ...
- 淘宝付邮试用Chrome桌面提醒插件(含源码)
淘宝付邮试用每天都会推出10元邮费试用的商品,有些对自己还是有用的.试用一下还不错,关键是便宜.不过,有些商家也抓住了买家贪便宜的特点,推出廉价垃圾商品.这里,大家还是慧眼识别了.每天浏览这些商品会很 ...
- MTM量身定制系统 - 富友ERP产品 - 信息化推动服装行业管理软件升级
MTM量身定制系统 - 富友ERP产品 - 信息化推动服装行业管理软件升级 国内第一款量体定制管理系统 结合富友软件10年服装行业经验和多家大型量身定制企业管理经验,推出的 ...
- C#实现盛大盛付通充值卡状态查询
今天有这样一需求,要求能够查询盛付通卡的状态,官网如下 http://www.801335.com/status/index.htm 刚一打开网址,发现两个输入框加一个验证码,心中一喜不是小 cas ...
- C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码)
原文:C# 实现对接电信交费易自动缴费 续(winio/winring0 自动填密码) 自动填密码大家可能都不莫生,最有名的应该是 按键精灵 只要是一个可以输入的地方都可以能过按键精灵来完成输入.我今 ...
- 友金所招聘Java工程师面试题
友金所是一家位于深圳南山科技园的P2P网贷公司,用友集团控股.该公司采用渐进式的问答面试,没有笔试题.比如面试者说熟悉多线程,面试官就问哪些方式解决并发:面试者说采用Synchronized或者Ree ...
- 话付通SDK 聚合支付
步骤 官网:http://www.71pay.cn/ 1.导入Jar包----将HeepayPlugin.jar,HftJuhePay.jar 包放入工程指定的libs目录. 2.配置清单文件---- ...
- Golang Web开发时前端出现谜之空白换行的坑
在使用Golang做Web开发时,有时候渲染出来的模板在前台显示时会出现一些奇怪的空白换行,具体特征就是查看css样式表并没有相关定义的空白部分. 分析: 查看出现问题页面的网页源代码,复制空白换行部 ...
随机推荐
- Mysql常用函数汇总-经典实用
以下是对mysql中的常用函数进行了汇总介绍.需要的朋友可以过来参考下. 一.数学函数ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x ...
- svn使用教程及常见问题解决方案
使用教程转自:http://www.cnblogs.com/armyfai/p/3985660.html SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本 ...
- codeforces 703E Mishka and Divisors
codeforces 703E Mishka and Divisors 题面 给出大小为\(1000\)的数组和一个数\(k\),求长度最短的一个子序列使得子序列的元素之积是\(k\)的倍数,如果有多 ...
- angular cli
1. 安装cnpm: npm install -g cnpm --registry=https://registry.npm.taobao.org 2. 安装angular/cli: cnpm ins ...
- BZOJ1048:[HAOI2007]分割矩阵(记忆化搜索DP)
Description 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个), 这样分割了(n-1)次后,原矩阵被分割成 ...
- Django中模型(五)
Django中模型(五) 六.模型查询 1.概述 查询集,表示从数据库获取的对象集合. 过滤器就是一个函数,基于所给的参数限制查询集结果.查询集可以有多个过滤器. 从sql角度来说,查询集合等价于se ...
- 【Java123】Yaml格式
yaml文件与java bean互转 https://blog.csdn.net/z04915231/article/details/60143947 Yaml转换list,json,map工具类 h ...
- php数组的定义和数组的赋值
1.php执行过程 加载页面 语法检测 执行脚本 $arr=array(1,2,3); 索引数组 $arr=array("name"=>"user1", ...
- PHP扩展功能----发送邮件
1.下载PHPMailer源码 github下载 (测试使用的是5.2.2 版本) 2.注册并登录网易邮箱(其他邮箱均可)[用于配置用户名和三方登录授权码,以及发送人邮箱地址] (1)开启POP3协 ...
- PAT——1052. 卖个萌
萌萌哒表情符号通常由“手”.“眼”.“口”三个主要部分组成.简单起见,我们假设一个表情符号是按下列格式输出的: [左手]([左眼][口][右眼])[右手] 现给出可选用的符号集合,请你按用户的要求输出 ...