设为首页 收藏本站
查看: 1101|回复: 0

[经验分享] Golang 对接宝付、通联、富友金账户...填坑记

[复制链接]

尚未签到

发表于 2018-9-20 13:37:00 | 显示全部楼层 |阅读模式
  一、宝付私钥加密,公钥解密
  由于对RSA加密解密原理不是很熟悉,宝付也没有Golang的Demo提供。Go语言库里一般都是私钥解密、公钥加密,或者私钥签名、公钥验签。宝付需要反过来,这里也到好找到了https://github.com/farmerx/gorsa的实现,但始终宝付那边提示签名验证失败。然后就继续找其他的实现了,这就惨了各种Google完全无解。最后回过头来只能,使用加解密原文,跟.Net平台的结果进行比对。一通折腾或者叫折磨之后,发现其实只是每次加密多了117个字节的全是0,后面的加密结果居然是跟其他平台一样的。由此对armerxgorsa做了如下修改,成功。
  这个前后花了3天时间。虽然解决问题的方式最终很简单,但是找到这条路的过程可真是披荆斩棘。
DSC0000.png

  二、通联密钥解析
  宝付的密钥直接使用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  

DSC0001.png

  三、富友金账户密钥
  有前面这些个坑,基本上平的差不多之后,对支付平台的加解密基本熟悉了,然后对接金账户就轻松多了。简单的尝试了一下,密钥。最终直接使用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)  

DSC0002.png

  五、业务接口对接
  其他就剩下主要业务接口的具体对接实现了。主要示例如下:完成了金账户的注册、宝付的裸扣、通联快捷代扣。代码开源在 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()
  
}
  




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-598928-1-1.html 上篇帖子: 【golang-GUI开发】qt之signal和slot(一) 下篇帖子: Golang之字符串操作(反转中英文字符串)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表