您的位置:   网站首页    行业动态    beego微信支付

beego微信支付

阅读量:3683393 2019-10-22



微信APP支付
//用于接收微信服务器返回的xml数据,转换为json格式返回给前端type wxPayModel struct { ReturnCode string `xml:"return_code" json:"returnCode"` ReturnMsg string `xml:"return_msg" json:"returnMsg"` AppId string `xml:"appid" json:"appId"` MchId string `xml:"mch_id" json:"mchId"` NonceStr string `xml:"nonce_str" json:"nonceStr"` Sign string `xml:"sign" json:"sign"` ResultCode string `xml:"result_code" json:"resultCode"` PrepayId string `xml:"prepay_id" json:"prepayId"` TradeType string `xml:"trade_type" json:"tradeType"`}
func (c *PayController) WXPay() { //微信传参地址 url := "https://api.mch.weixin.qq.com/pay/unifiedorder" //获取配置信息(这里是执行了数据库查询,将微信相关字段返回) config := getConfigInfo()
//根据实际内容填充数据 total_fee := "1" //以分为单位 body := "body" out_trade_no := tools.GetRandNum(18) trade_type := "APP" nonce_str := tools.GetRandSeq(32) spbill_create_ip := strings.Split(c.Ctx.Request.RemoteAddr, ":")[0] data := map[string]string{ "out_trade_no": out_trade_no, "spbill_create_ip": spbill_create_ip, "trade_type": trade_type, "nonce_str": nonce_str, "body": body, "total_fee": total_fee, "notify_url": config.WXPayNotifyUrl, "appid": config.WXPayAppId, "mch_id": config.WXPayMchId, }
//字典按key值排序,并拼接 paramString := sortParamAndJoint(data) //再将key拼入到最后 paramString = paramString + "key=" + config.WXPayKey //将拼接字符串加密,并转为大写 sign := strings.ToUpper(tools.MD5Hash(paramString)) //拼接成XML 格式 postData := "<xml><appid>" + config.WXPayAppId + "</appid>" + "<body>" + body + "</body>" + "<mch_id>" + config.WXPayMchId + "</mch_id>" + "<nonce_str>" + nonce_str + "</nonce_str>" + "<notify_url>" + config.WXPayNotifyUrl + "</notify_url>" + "<out_trade_no>" + out_trade_no + "</out_trade_no>" + "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" + "<total_fee>" + total_fee + "</total_fee>" + "<trade_type>" + trade_type + "</trade_type>" + "<sign>" + sign + "</sign>" + "</xml>"
//curl命令没找到怎么直接发送字符串(非key-value形式的,最后想到用shell命令执行curl语句) param := bytes.NewBufferString(postData) req, _ := http.NewRequest("POST", url, param) command, _ := http2curl.GetCurlCommand(req) //command为完整的curl语句 res, _ := tools.Exec_shell(string(command.String()))
//将返回的xml数据解析成结构和和JSON mo := wxPayModel{} xml.Unmarshal([]byte(res), &mo)
if mo.ResultCode == "SUCCESS" && mo.ReturnCode == "SUCCESS" { //两者都为SUCCESS,则统一下单操作完成,再去获取调起微信支付的参数 data = map[string]string{ "appid": config.WXPayAppId, "partnerid": config.WXPayMchId, "prepayid": mo.PrepayId, "package": "prepay_id=" + mo.PrepayId, "timestamp": tools.GetTimeStamps(10), "noncestr": tools.GetRandSeq(32), } //字典按key值排序,并拼接 paramString = sortParamAndJoint(data) //再将key拼入到最后 paramString = paramString + "key=" + config.WXPayKey //将拼接字符串加密,并转为大写 sign := strings.ToUpper(tools.MD5Hash(paramString)) data["sign"] = sign data["signtype"] = "MD5" //将数据返回给前端调起微信支付 c.Data["json"] = models.SuccessResult(data, "成功") c.ServeJSON() return } else { c.Data["json"] = models.ErrorResult(mo.ReturnMsg) c.ServeJSON() return }}/*微信字典排序拼接*/func sortParamAndJoint(data map[string]string) string { //1.定义一个slice s1 := make([]string, 0, len(data)) //2.遍历map获取key-->s1中 for key := range data { s1 = append(s1, key) } //3.给s1进行排序 sort.Strings(s1) //使用sort包下的方法直接排序,不用自己写冒泡了。 //4. 遍历s1,map var paramString string = "" for _, k := range s1 { // 先下标,再数值 paramString = paramString + k + "=" + data[k] + "&" } return paramString}

在线QQ咨询,点这里

QQ咨询

微信服务号