本文章主要是通过golang实现了支付宝手机网页支付的简单封装,封装的基本都是请求的必传参数,如果需要其他参数,可以自己修改BizContent结构体来满足自己的需求。

封装的文件大体分为4个文件:

config.go 用来放基本配置参数,现在只放了需要用的rsa用户私钥和阿里rsa公钥,其中用户私钥本封装文件用的pkcs8的,你也可以修改为pkcs1的

dao.go 主要是存放了BizConten结构体,里面只有必传参数,可以自行修改

sign.go 主要是生成签名字符串的,生成正确会返回一个字符串

pay.go 主要的封装文件,实现了post请求,通过调用pay方法会返回一个编码后的body体(返回的是个网页直接输出到页面就好),还有一个err参数,正确返回nil

大致项目结构如下:

config.go文件 :

package alipayconst (private_key = ``alipay_public_key = ``
)

dao.go 文件 :在实际操作中,我们需要对金额做一些处理,不能直接用float,这会导致有时数据不对。在此可以使用github.com/shopspring/decimal,或者直接金额一般到分直接用户分为单位采用整型

package alipaytype BizContent struct {Subject     string `json:"subject"`OutTradeNo  string `json:"out_trade_no"`TotalAmount float32    `json:"total_amount"`ProductCode string `json:"product_code"`
}

sign.go 文件:通过修改rsaEncrypt方法中的x509.ParsePKCS8PrivateKey(block2.Bytes),修改为x509.ParsePKCS1PrivateKey(block2.Bytes),这样就可以使用pkcs1的钥匙

package alipay
import ("sort""fmt""encoding/base64""encoding/pem""crypto/x509""crypto/rsa""crypto/sha256""crypto""net/url""crypto/rand"
)func sign(m url.Values) string {//对url.values进行排序sign := ""var keys []stringfor k := range m {keys = append(keys, k)}sort.Strings(keys)for i, k := range keys {if m.Get(k) != "" {if i==0{sign = k+"="+m.Get(k)}else {sign = sign + "&"+ k+"="+m.Get(k)}}}fmt.Println(sign)//对排序后的数据进行rsa2加密,获得signb,_ := rsaEncrypt([]byte(sign))fmt.Println("加密:",b)fmt.Println("base加密:",base64.StdEncoding.EncodeToString(b))return base64.StdEncoding.EncodeToString(b)
}func rsaEncrypt(origData []byte) ([]byte, error) {key := private_keyblock2, _ := pem.Decode([]byte(key))//PiravteKeyData为私钥文件的字节数组if block2 == nil {fmt.Println("block空")return nil,nil}//priv即私钥对象,block2.Bytes是私钥的字节流priv, err := x509.ParsePKCS8PrivateKey(block2.Bytes)if err != nil {fmt.Println("无法还原私钥")return nil,nil}p := priv.(*rsa.PrivateKey)h2 := sha256.New()h2.Write(origData)hashed := h2.Sum(nil)signature2, err := rsa.SignPKCS1v15(rand.Reader, p,crypto.SHA256, hashed)//签名return signature2,err
}

pay.go 文件:

package alipayimport ("net/url""time""net/http""fmt""io/ioutil""github.com/axgle/mahonia"
)func Pay(appId string,returnUrl string,notifyUrl string,bizContent string) (s string,err error) {var data = url.Values{}//var clusterinfo = map[string]string{}data.Add("app_id", appId)data.Add("method", "alipay.trade.wap.pay")if returnUrl != "" {data.Add("return_url",returnUrl)}if notifyUrl != "" {data.Add("notify_url", returnUrl)}data.Add("format", "json")data.Add("charset", "UTF-8")data.Add("sign_type", "RSA2")data.Add("timestamp", time.Now().Format("2006-01-02 15:04:05"))data.Add("version", "1.0")data.Add("biz_content",bizContent)data.Add("sign", sign(data))resp, err := http.PostForm("https://openapi.alipay.com/gateway.do",data)defer resp.Body.Close()if err != nil {fmt.Println(err)return "",err}body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println(err)return "",err}d := mahonia.NewDecoder("utf-8")return d.ConvertString(string(body)),err
}

调用方法,在你需要调用的方法中加入以下代码即可,例如:

func ali(c echo.Context) error {bizContent := new(alipay.BizContent)bizContent.Subject = "ceshi"bizContent.OutTradeNo = "1111112312312312312"bizContent.TotalAmount = 0.01bizContent.ProductCode = "QUICK_WAP_WAY"e,err := json.Marshal(bizContent)if err != nil {return err}body,err := alipay.Pay("","","",string(e))if err != nil {return err}return c.HTML(200,body)
}

支付宝手机网页支付之golang版相关推荐

  1. 支付宝手机网页支付java demo调试问题和解决办法

    在使用支付宝手机网页支付的时候遇到一些问题跟大家分享一下. 1.生成签名的时候,使用Base64加密时报错:DerInputStream.getLength():lengthTag = 127, to ...

  2. php手机网站支付宝_php支付宝手机网页支付类实例

    本文实例讲述了php支付宝手机网页支付类.分享给大家供大家参考.具体分析如下: 此处注意: ① 该类是用在Yii框架里面的,没有去掉一些框架的东西. ② 本类不能不做任何修改而使用. 1. PHP代码 ...

  3. android 仿支付页面,【android仿系列进阶篇】android 支付宝手机网页支付

    最近在做android-,恩,就说这么多吧 1,准备工作 当然了,假设你已经有了pid(partner)和商户账户(seller),并且开通了手机网页支付功能. 下载的包里面,打开[手机网页即时到账接 ...

  4. 支付宝手机网页支付即时到账接口

    mycncart的前后台均为移动设备方便访问,支付宝方面单独针对移动设备访问网站设立了支付接口,普通的支付宝即时到账接口无法在手机网页上正常支付 本支付插件是支付宝手机网页即时到账接口. 本插件需要解 ...

  5. 支付宝手机网页支付接口调用

    1.前期工作 1.1 登陆支付宝官网 网址:https://www.alipay.com/ 1.2 下载手机网站支付的demo的步骤 1.2.1 先点击API,选择手机网站支付模块点击 1.2.2 点 ...

  6. 支付宝支付,支付宝手机网页支付

    1.首先你需要与支付宝的蚂蚁金服建立合作关系然后进入开放平台 2.在开放平台中建立你的应用,我这里的应用已经创建好了,就不在演示了,这个也比较简单 3.在应用中添加你需要的功能,注意:添加的功能必须是 ...

  7. 接入支付宝手机网页支付详解

    主要就是要在后端构建一个html表单,以一个接口返回给前端,前端加载html后就会自动跳转到支付页面 <form id='alipaysubmit' name='alipaysubmit' ac ...

  8. thinkphp6项目的支付宝手机网页支付接入

    搞了两天,踩了一大堆坑,终于对接好支付宝的支付了,下面记录 一下最近对接的心得. 先说效果,我建立了一个控制器,方法pay,传入订单ID,就可以支付这个订单了,回调建立方法,notify_url,有了 ...

  9. ecshop 手机版的php代码在哪里,PHP 在ecshop上集成 手机网页支付_php

    参考alipay网页支付接口的代码 其实原理跟ecshop上集成的alipay支付差不多  就是因为利用curl请求的时候相应时间过长 所以不能直接去先post数据再生成button /** * 生成 ...

最新文章

  1. GitHub的AI写代码翻车了,会在注释里给你写上what the f***,因为...
  2. Android动态替换dex,Android DexClassLoader动态加载与插件化开发
  3. rocketmq queue_RocketMQ在面试中那些常见问题及答案+汇总
  4. VTK:网格之Decimation
  5. mysql 字符设置与修改
  6. MyBatis的resultType和resultMap的区别
  7. Linux 命令(76)—— kill 命令
  8. c++多边形扫描线填充算法_一文读懂扫描线算法
  9. 2741. [济南集训 2017] 掰巧克力
  10. STM32 固件包下载
  11. 基于JAVA宠物店管理系统设计与实现计算机毕业设计源码+数据库+lw文档+系统+部署
  12. PB:玉米气生根分泌物支持的高效生物固氮
  13. Cobot专长:了解您的日常需求
  14. pandas的数据拼接与合并(concat、join、merge)
  15. SQLTRACE的几个用法
  16. [《关于外婆家的一些记忆》闲笔记事集]2012年1月22日
  17. Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localizati论文精读及资源整理
  18. android 短信 app下载,云短信app下载安装-云短信 安卓版v2.0.0-PC6安卓网
  19. Linux的虚拟内存
  20. ODN 2006丨艾美捷CpG ODN系列说明书

热门文章

  1. 中兴光纤猫 F420 破解
  2. html5 仪表盘 效果,html5动效系列十四:jQuery仪表盘指示器动画插件 6种仪表样式...
  3. linux创建用户并修改用户家目录
  4. thymeleaf 遍历map
  5. Elasticsearch深入学习之一(sense的插件安装使用)
  6. python土味情话_爱数智慧推出方言TTS数据 AI也能飚出“土味儿情话”
  7. android中页面自动跳转,【学习笔记-安卓开发】8. Android Studio如何实现页面自动跳转(安卓学习系列博客)...
  8. 天梯赛 L2-028 秀恩爱分得快 (25 分)[测试点3 4 5][未填坑]
  9. 贷款计算器我的压力山大
  10. 如何实现一个强大的MMO技能系统