소스 검색

发红包

yaotian 8 년 전
부모
커밋
b0d5a9ba4d
4개의 변경된 파일85개의 추가작업 그리고 15개의 파일을 삭제
  1. 26 0
      docs/doc.adoc
  2. 33 1
      docs/doc.html
  3. 2 2
      mch/paytool/cash_coupon.go
  4. 24 12
      mch/paytool/redpack.go

+ 26 - 0
docs/doc.adoc

@@ -405,6 +405,32 @@ if err != nil {
 
 === 账单
 
+=== 发红包
+
+前提条件:发红包前,你必须在商户平台中充值
+
+==== 1. 获得接口
+
+[source,go]
+----
+
+//商户平台接口
+mch , err := wc.MchMgr()
+if err != nil {
+  return
+}
+payTool := mch.GetPayTool()
+
+----
+
+==== 2. RedPackInput
+var input = paytool.RedPackInput{
+  ToOpenID:""
+}
+
+
+==== 3. SendRedPack
+
 
 [[open,open]]
 == 开放平台

+ 33 - 1
docs/doc.html

@@ -471,6 +471,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
 <li><a href="#_订单">订单</a></li>
 <li><a href="#_退款">退款</a></li>
 <li><a href="#_账单">账单</a></li>
+<li><a href="#_发红包">发红包</a></li>
 </ul>
 </li>
 <li><a href="#open">开放平台</a></li>
@@ -1032,6 +1033,37 @@ if err != nil {
 <div class="sect2">
 <h3 id="_账单">账单</h3>
 
+</div>
+<div class="sect2">
+<h3 id="_发红包">发红包</h3>
+<div class="paragraph">
+<p>前提条件:发红包前,你必须在商户平台中充值</p>
+</div>
+<div class="sect3">
+<h4 id="_1_获得接口">1. 获得接口</h4>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-go" data-lang="go">//商户平台接口
+mch , err := wc.MchMgr()
+if err != nil {
+  return
+}
+payTool := mch.GetPayTool()</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_2_redpackinput">2. RedPackInput</h4>
+<div class="paragraph">
+<p>var input = paytool.RedPackInput{
+  ToOpenID:""
+}</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_3_sendredpack">3. SendRedPack</h4>
+
+</div>
 </div>
 </div>
 </div>
@@ -1062,7 +1094,7 @@ if err != nil {
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2017-12-25 16:52:30 CST
+Last updated 2018-01-25 20:56:27 CST
 </div>
 </div>
 </body>

+ 2 - 2
mch/paytool/cash_coupon.go

@@ -17,7 +17,7 @@ func NewPayTool(context *wxcontext.Context) *PayTool {
 	return payT
 }
 
-//SendRedPack 发现金红包
-func (c *PayTool) SendRedPack(req map[string]string) (resp map[string]string, err error) {
+//SendRedPackRaw 发现金红包
+func (c *PayTool) SendRedPackRaw(req map[string]string) (resp map[string]string, err error) {
 	return c.PostXML("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", req, true)
 }

+ 24 - 12
mch/paytool/redpack.go

@@ -1,4 +1,4 @@
-package pay
+package paytool
 
 import (
 	"errors"
@@ -11,6 +11,10 @@ import (
 )
 
 //官方文档: https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_4&index=3
+var (
+	//ErrNoEnoughMoney 商户平台上的余额不足,给用户发不了红包
+	ErrNoEnoughMoney = errors.New("No enough money")
+)
 
 const (
 	//SceneIDPromotion 商品促销
@@ -28,8 +32,8 @@ const (
 	//SceneIDAgentBonous 渠道分润
 	SceneIDAgentBonous = "PRODUCT_5"
 
-	//SceneIDAgentInsurance 保险回馈
-	SceneIDAgentInsurance = "PRODUCT_6"
+	//SceneIDInsurance 保险回馈
+	SceneIDInsurance = "PRODUCT_6"
 
 	//SceneIDLottery 彩票派奖
 	SceneIDLottery = "PRODUCT_7"
@@ -54,13 +58,14 @@ type RedPackInput struct {
 	SceneID string
 }
 
+//Check check input
 func (m *RedPackInput) Check() (isGood bool, err error) {
-	if input.ToOpenID == "" || input.MoneyFen == 0 || input.SendName == "" || input.Wishing == "" || input.ActName == "" || input.Remark == "" || input.IP == "" {
+	if m.ToOpenID == "" || m.MoneyFen == 0 || m.SendName == "" || m.Wishing == "" || m.ActName == "" || m.Remark == "" || m.IP == "" {
 		err = fmt.Errorf("%s", "Input有必填项没有值")
 		return
 	}
 
-	if input.MoneyFen >= 200*100 && input.SceneID == "" {
+	if m.MoneyFen >= 200*100 && m.SceneID == "" {
 		err = fmt.Errorf("%s", "大于200元的红包,必须设置SceneID")
 		return
 	}
@@ -93,31 +98,38 @@ func (c *PayTool) SendRedPack(input RedPackInput) (isSuccess bool, err error) {
 	signMap["remark"] = input.Remark
 	signMap["sign"] = base.Sign(signMap, c.MchAPIKey, nil)
 
-	respMap, err := c.SendRedPack(signMap)
+	respMap, err := c.SendRedPackRaw(signMap)
 	if err != nil {
 		return false, err
 	}
 
-	result_code, ok := respMap["result_code"]
+	resultCode, ok := respMap["result_code"]
 	if !ok {
 		err = errors.New("no result_code")
 		return false, err
 	}
 
-	if result_code != "SUCCESS" {
-		err = errors.New("result code is not success")
+	if resultCode != "SUCCESS" {
+		returnMsg, _ := respMap["return_msg"]
+		errMsg, _ := respMap["err_code_des"]
+		errCode, _ := respMap["err_code"]
+
+		if errCode == "NOTENOUGH" {
+			return false, ErrNoEnoughMoney
+		}
+
+		err = fmt.Errorf("Err:%s return_msg:%s err_code:%s err_code_des:%s", "result code is not success", returnMsg, errCode, errMsg)
 		return false, err
 	}
 
-	mch_billno, ok := respMap["mch_billno"]
+	mchBillNo, ok := respMap["mch_billno"]
 	if !ok {
 		err = errors.New("no mch_billno")
 		return false, err
 	}
 
-	if billno != mch_billno {
+	if billno != mchBillNo {
 		err = errors.New("billno is not correct")
-		beego.Error(err)
 		return false, err
 	}