一、支付流程
微信开放平台H5支付接入相关链接:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
相应的支付流程:
二、相关代码
1、统一下单
//首先定义一个UnifyOrderReq用于填入我们要传入的参数。
type UnifyOrderReq struct {
Appid string `xml:"appid"`
Body string `xml:"body"`
Mch_id string `xml:"mch_id"`
Nonce_str string `xml:"nonce_str"`
Notify_url string `xml:"notify_url"`
Trade_type string `xml:"trade_type"`
Spbill_create_ip string `xml:"spbill_create_ip"`
Total_fee int `xml:"total_fee"`
Out_trade_no string `xml:"out_trade_no"`
Sign string `xml:"sign"`
}
//wxpay计算签名的函数
func (o *APIHandler) wxpayCalcSign(mReq map[string]interface{}, key string) (sign string) {
log4go.Debug("wxpayCalcSign()...API KEY:%s", key)
//STEP 1, 对key进行升序排序.
sorted_keys := make([]string, 0)
for k, _ := range mReq {
sorted_keys = append(sorted_keys, k)
}
sort.Strings(sorted_keys)
//STEP2, 对key=value的键值对用&连接起来,略过空值
var signStrings string
for _, k := range sorted_keys {
fmt.Printf("k=%v, v=%v\n", k, mReq[k])
value := fmt.Sprintf("%v", mReq[k])
if value != "" {
signStrings = signStrings + k + "=" + value + "&"
}
}
//STEP3, 在键值对的最后加上key=API_KEY
if key != "" {
signStrings = signStrings + "key=" + key
}
log4go.Debug("wxpayCalcSign()...signStrings:%s", signStrings)
//STEP4, 进行MD5签名并且将所有字符转为大写.
md5Ctx := md5.New()
md5Ctx.Write([]byte(signStrings))
cipherStr := md5Ctx.Sum(nil)
upperSign := strings.ToUpper(hex.EncodeToString(cipherStr))
return upperSign
}
func (o *APIHandler) wxUnifyChargeReq(userId int64, orderNo string) (string, error) {
log4go.Debug("wxUnifyChargeReq()...userId:%d, orderNo:%s", userId, orderNo)
bookOrder, err := o.GetOrderByOrderNoDb(orderNo)
if err != nil {
log4go.Error("wxUnifyChargeReq