Jerry 7 лет назад
Родитель
Сommit
1ada928bcf
6 измененных файлов с 133 добавлено и 105 удалено
  1. 24 9
      README.md
  2. 19 0
      alipay_response.go
  3. 21 0
      util.go
  4. 4 82
      wechat_params.go
  5. 62 0
      wechat_request_body.go
  6. 3 14
      wechat_response.go

+ 24 - 9
README.md

@@ -9,6 +9,21 @@
 <img src="https://img.shields.io/badge/Build-passing-brightgreen.svg"/>
 <a href="http://www.apache.org/licenses/LICENSE-2.0" target="_blank"><img src="https://img.shields.io/badge/License-Apache 2-blue.svg"/></a>
 
+## 微信
+* 统一下单
+    * JSAPI - JSAPI支付(或小程序支付)
+    * NATIVE - Native支付
+    * APP - app支付
+    * MWEB - H5支付
+* 查询订单(开发中)
+* 关闭订单(开发中)
+* 申请退款(开发中)
+* 查询退款(开发中)
+* 下载对账单(开发中)
+* 下载资金账单(开发中)
+* 拉取订单评价数据(开发中)
+
+
 ## 安装
 
 ```bash
@@ -19,13 +34,13 @@ $ go get github.com/iGoogle-ink/gopay
 
 [GoPay使用手册](https://doc.gopay.ink)
 
-## 微信支付 example
+## 微信统一下单 example
 
 * 初始化客户端
-    * AppId:应用ID
-    * mchID:商户ID
-    * secretKey:Key值
-    * isProd:是否正式环境
+    * 参数:AppId:应用ID
+    * 参数:mchID:商户ID
+    * 参数:secretKey:Key值
+    * 参数:isProd:是否正式环境
 ```go
 //正式环境 
 client := gopay.NewWeChatClient("wxd678efh567hg6787", "1230000109", "192006250b4c09247ec02edce69f6a2d", true)
@@ -37,7 +52,7 @@ client := gopay.NewWeChatClient("wxd678efh567hg6787", "1230000109", "192006250b4
 * 初始化统一下单参数
 > 以下参数设置皆为必选参数,如需其他参数,请参考API文档。
 >
-> 参考文档:[微信支付文档](https://pay.weixin.qq.com/wiki/doc/api/index.html),[JSAPI支付:统一下单文档](https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
+> 参考文档:[微信支付文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)
 ```go
 params := new(gopay.WeChatPayParams)
 params.NonceStr = "dyUNIkNS29hvDUC1CmoF0alSdfCQGg9I"
@@ -46,14 +61,14 @@ params.OutTradeNo = "GYsadfjk4dhg3fkh3ffgnlsdkf"
 params.TotalFee = 10 //单位为分,如沙箱环境,则默认为101
 params.SpbillCreateIp = "127.0.0.1"
 params.NotifyUrl = "http://www.igoogle.ink"
-params.TradeType = gopay.WX_PayType_JsApi //目前只支持JSAPI有效
+params.TradeType = gopay.WX_PayType_JsApi
 params.DeviceInfo = "WEB"
 params.SignType = gopay.WX_SignType_HMAC_SHA256 //如不设置此参数,默认为MD5,如沙箱环境,则默认为MD5
-params.Openid = "o0Df70H2Q0fY8JXh1aFPIRyOBgu8"
+params.Openid = "o0Df70H2Q0fY8JXh1aFPIRyOBgu8" //JSAPI 方式时,此参数必填
 ```
 
 * 发起统一下单请求
-    * param:统一下单请求参数
+    * 参数:param:统一下单请求参数
 > 请求成功后,获取下单结果
 ```go
 wxRsp, err := client.UnifiedOrder(params)

+ 19 - 0
alipay_response.go

@@ -0,0 +1,19 @@
+//==================================
+//  * Name:Jerry
+//  * Tel:18017448610
+//  * DateTime:2019/1/16 0:30
+//==================================
+package gopay
+
+type aliPayResponse struct {
+	ReturnCode string `xml:"return_code"`
+	ReturnMsg  string `xml:"return_msg"`
+	Appid      string `xml:"appid"`
+	MchId      string `xml:"mch_id"`
+	DeviceInfo string `xml:"device_info"`
+	NonceStr   string `xml:"nonce_str"`
+	Sign       string `xml:"sign"`
+	ResultCode string `xml:"result_code"`
+	PrepayId   string `xml:"prepay_id"`
+	TradeType  string `xml:"trade_type"`
+}

+ 21 - 0
util.go

@@ -6,6 +6,27 @@ import (
 	"time"
 )
 
+type requestBody map[string]string
+
+//获取参数
+func (w requestBody) Get(key string) string {
+	if w == nil {
+		return ""
+	}
+	ws := w[key]
+	return ws
+}
+
+//设置参数
+func (w requestBody) Set(key string, value string) {
+	w[key] = value
+}
+
+//删除参数
+func (w requestBody) Remove(key string) {
+	delete(w, key)
+}
+
 //获取随机字符串
 //    length:字符串长度
 func GetRandomString(length int) string {

+ 4 - 82
wechat_params.go

@@ -6,7 +6,6 @@ import (
 	"crypto/md5"
 	"crypto/sha256"
 	"encoding/hex"
-	"encoding/json"
 	"encoding/xml"
 	"errors"
 	"github.com/parnurzeal/gorequest"
@@ -15,84 +14,6 @@ import (
 	"strings"
 )
 
-type requestBody map[string]string
-
-//获取参数
-func (w requestBody) Get(key string) string {
-	if w == nil {
-		return ""
-	}
-	ws := w[key]
-	return ws
-}
-
-//设置参数
-func (w requestBody) Set(key string, value string) {
-	w[key] = value
-}
-
-//删除参数
-func (w requestBody) Remove(key string) {
-	delete(w, key)
-}
-
-// 必选.
-//    Appid: 微信支付分配的公众账号ID(企业号corpid即为此appId).
-//    MchId: 微信支付分配的商户号.
-//    NonceStr: 随机字符串,长度要求在32位以内(如不写,go-pay将为你随机生成).
-//    Body: 商品简单描述.
-//    OutTradeNo: 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一.
-//    TotalFee: 订单总金额,单位为分.
-//    SpbillCreateIp: 支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP.
-//    NotifyUrl: 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数.
-//    TradeType: 交易类型:(JSAPI--JSAPI支付(或小程序支付)、NATIVE--Native支付、APP--app支付,MWEB--H5支付,不同trade_type决定了调起支付的方式).
-//
-// 非必选.
-//    DeviceInfo: 自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB".
-//    SignType: 签名类型,默认为MD5,支持HMAC-SHA256和MD5.
-//    Detail: 商品详细描述,对于使用单品优惠的商户,字段必须按照规范上传.
-//    Attach: 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用.
-//    FeeType: 符合ISO 4217标准的三位字母代码,默认人民币:CNY.
-//    TimeStart: 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010.
-//    TimeExpire: 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。订单失效时间是针对订单号而言的,由于在请求支付的时候有一个必传参数prepay_id只有两小时的有效期,所以在重入时间超过2小时的时候需要重新请求下单接口获取新的prepay_id.
-//    GoodsTag: 订单优惠标记,使用代金券或立减优惠功能时需要的参数.
-//    ProductId: trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义.
-//    LimitPay: 上传此参数 no_credit 可限制用户不能使用信用卡支付.
-//    Openid: 用户标识: trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识.
-//    Receipt: Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效.
-//    SceneInfo: 该字段常用于线下活动时的场景信息上报,支持上报实际门店信息,商户也可以按需求自己上报相关信息。该字段为JSON对象数据,对象格式为{"store_info":{"id": "门店ID","name": "名称","area_code": "编码","address": "地址" }}.
-type WeChatPayParams struct {
-	NonceStr       string `xml:"nonce_str"`
-	Body           string `xml:"body"`
-	OutTradeNo     string `xml:"out_trade_no"`
-	TotalFee       int    `xml:"total_fee"`
-	SpbillCreateIp string `xml:"spbill_create_ip"`
-	NotifyUrl      string `xml:"notify_url"`
-	TradeType      string `xml:"trade_type"`
-
-	DeviceInfo string     `xml:"device_info"`
-	SignType   string     `xml:"sign_type"`
-	Detail     string     `xml:"detail"`
-	Attach     string     `xml:"attach"`
-	FeeType    string     `xml:"fee_type"`
-	TimeStart  string     `xml:"time_start"`
-	TimeExpire string     `xml:"time_expire"`
-	GoodsTag   string     `xml:"goods_tag"`
-	ProductId  string     `xml:"product_id"`
-	LimitPay   string     `xml:"limit_pay"`
-	Openid     string     `xml:"openid"`
-	Receipt    string     `xml:"receipt"`
-	SceneInfo  *StoreInfo `xml:"scene_info"`
-}
-
-//StoreInfo: SceneInfo 的字段信息
-type StoreInfo struct {
-	Id       string `json:"id"`        // 门店唯一标识
-	Name     string `json:"name"`      // 门店名称
-	AreaCode string `json:"area_code"` // 门店所在地行政区划码,详细见《最新县及县以上行政区划代码》
-	Address  string `json:"address"`   // 门店详细地址
-}
-
 //获取请求支付的参数
 func (w *WeChatPayParams) getRequestBody(appId, mchId string, params *WeChatPayParams) (reqs requestBody) {
 	reqs = make(requestBody)
@@ -144,9 +65,10 @@ func (w *WeChatPayParams) getRequestBody(appId, mchId string, params *WeChatPayP
 	if params.Receipt != "" {
 		reqs.Set("receipt", params.Receipt)
 	}
-	if params.SceneInfo != nil {
-		marshal, _ := json.Marshal(params.SceneInfo)
-		reqs.Set("scene_info", string(marshal))
+	if params.SceneInfo != "" {
+		//marshal, _ := json.Marshal(params.SceneInfo)
+		//reqs.Set("scene_info", string(marshal))
+		reqs.Set("scene_info", params.SceneInfo)
 	}
 	return reqs
 }

+ 62 - 0
wechat_request_body.go

@@ -0,0 +1,62 @@
+//==================================
+//  * Name:Jerry
+//  * Tel:18017448610
+//  * DateTime:2019/1/16 0:12
+//==================================
+package gopay
+
+// 必选.
+//    Appid: 微信支付分配的公众账号ID(企业号corpid即为此appId).
+//    MchId: 微信支付分配的商户号.
+//    NonceStr: 随机字符串,长度要求在32位以内(如不写,go-pay将为你随机生成).
+//    Body: 商品简单描述.
+//    OutTradeNo: 商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|*且在同一个商户号下唯一.
+//    TotalFee: 订单总金额,单位为分.
+//    SpbillCreateIp: 支持IPV4和IPV6两种格式的IP地址。调用微信支付API的机器IP.
+//    NotifyUrl: 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数.
+//    TradeType: 交易类型:(JSAPI--JSAPI支付(或小程序支付)、NATIVE--Native支付、APP--app支付,MWEB--H5支付,不同trade_type决定了调起支付的方式).
+//
+// 非必选.
+//    DeviceInfo: 自定义参数,可以为终端设备号(门店号或收银设备ID),PC网页或公众号内支付可以传"WEB".
+//    SignType: 签名类型,默认为MD5,支持HMAC-SHA256和MD5.
+//    Detail: 商品详细描述,对于使用单品优惠的商户,字段必须按照规范上传.
+//    Attach: 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用.
+//    FeeType: 符合ISO 4217标准的三位字母代码,默认人民币:CNY.
+//    TimeStart: 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010.
+//    TimeExpire: 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。订单失效时间是针对订单号而言的,由于在请求支付的时候有一个必传参数prepay_id只有两小时的有效期,所以在重入时间超过2小时的时候需要重新请求下单接口获取新的prepay_id.
+//    GoodsTag: 订单优惠标记,使用代金券或立减优惠功能时需要的参数.
+//    ProductId: trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义.
+//    LimitPay: 上传此参数 no_credit 可限制用户不能使用信用卡支付.
+//    Openid: 用户标识: trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识.
+//    Receipt: Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效.
+//    SceneInfo: 该字段常用于线下活动时的场景信息上报,支持上报实际门店信息,商户也可以按需求自己上报相关信息。该字段为JSON对象数据,对象格式为{"store_info":{"id": "门店ID","name": "名称","area_code": "编码","address": "地址" }}.
+type WeChatPayParams struct {
+	NonceStr       string `xml:"nonce_str"`
+	Body           string `xml:"body"`
+	OutTradeNo     string `xml:"out_trade_no"`
+	TotalFee       int    `xml:"total_fee"`
+	SpbillCreateIp string `xml:"spbill_create_ip"`
+	NotifyUrl      string `xml:"notify_url"`
+	TradeType      string `xml:"trade_type"`
+	DeviceInfo     string `xml:"device_info"`
+	SignType       string `xml:"sign_type"`
+	Detail         string `xml:"detail"`
+	Attach         string `xml:"attach"`
+	FeeType        string `xml:"fee_type"`
+	TimeStart      string `xml:"time_start"`
+	TimeExpire     string `xml:"time_expire"`
+	GoodsTag       string `xml:"goods_tag"`
+	ProductId      string `xml:"product_id"`
+	LimitPay       string `xml:"limit_pay"`
+	Openid         string `xml:"openid"`
+	Receipt        string `xml:"receipt"`
+	SceneInfo      string `xml:"scene_info"`
+}
+
+//StoreInfo: SceneInfo 的字段信息
+type StoreInfo struct {
+	Id       string `json:"id"`        // 门店唯一标识
+	Name     string `json:"name"`      // 门店名称
+	AreaCode string `json:"area_code"` // 门店所在地行政区划码,详细见《最新县及县以上行政区划代码》
+	Address  string `json:"address"`   // 门店详细地址
+}

+ 3 - 14
response.go → wechat_response.go

@@ -16,8 +16,10 @@ type weChatPayResponse struct {
 	ResultCode string `xml:"result_code"`
 	ErrCode    string `xml:"err_code"`
 	ErrCodeDes string `xml:"err_code_des"`
-	PrepayId   string `xml:"prepay_id"`
 	TradeType  string `xml:"trade_type"`
+	PrepayId   string `xml:"prepay_id"`
+	CodeUrl    string `xml:"code_url"`
+	MwebUrl    string `xml:"mweb_url"`
 }
 
 type getSignKeyResponse struct {
@@ -28,16 +30,3 @@ type getSignKeyResponse struct {
 	MchId          string `xml:"mch_id"`
 	SandboxSignkey string `xml:"sandbox_signkey"`
 }
-
-type aliPayResponse struct {
-	ReturnCode string `xml:"return_code"`
-	ReturnMsg  string `xml:"return_msg"`
-	Appid      string `xml:"appid"`
-	MchId      string `xml:"mch_id"`
-	DeviceInfo string `xml:"device_info"`
-	NonceStr   string `xml:"nonce_str"`
-	Sign       string `xml:"sign"`
-	ResultCode string `xml:"result_code"`
-	PrepayId   string `xml:"prepay_id"`
-	TradeType  string `xml:"trade_type"`
-}