pap.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. // 微信委托代扣
  2. // 在线文档:
  3. // https://pay.weixin.qq.com/wiki/doc/api/pap.php?chapter=18_17&index=6
  4. package wechat
  5. import "encoding/xml"
  6. // PapPay 委托代扣申请扣款
  7. type PapPay struct {
  8. XMLName xml.Name `xml:"xml"`
  9. AppID string `xml:"appid"`
  10. MchID string `xml:"mch_id"`
  11. NonceStr string `xml:"nonce_str"` // 随机字符串,不长于32位
  12. Sign string `xml:"sign"` // 签名
  13. Body string `xml:"body"` // 商品或支付单简要描述, max 32
  14. Detail string `xml:"detail"` // 商品名称明细列表, 8192
  15. Attach string `xml:"attach"` // 附加数据,在查询API和支付通知中原样返回
  16. OutTradeNo string `xml:"out_trade_no"` // 商户系统内部的订单号, 32个字符内、可包含字母
  17. TotalFee int `xml:"total_fee"` // 订单总金额,单位为分,只能为整数
  18. SpbillCreateIP string `xml:"spbill_create_ip"` // 调用微信支付API的机器IP
  19. NotifyURL string `xml:"notify_url"` // 接受扣款结果异步回调通知的url
  20. ContractID string `xml:"contract_id"` // 委托代扣协议id
  21. OpenID string `xml:"openid"` // OpenID
  22. Mobile string `xml:"mobile"` // 手机号
  23. Creid string `xml:"creid"` // 身份证号码
  24. Timestamp int `xml:"timestamp"` // 时间戳, 10位时间戳
  25. }
  26. // PapPayApply 委托代扣申请扣款
  27. func PapPayApply(config WePayConfig, order PapPay) (reply WePayReply, err error) {
  28. m := make(map[string]interface{})
  29. m["appid"] = order.AppID
  30. m["mch_id"] = order.MchID
  31. m["nonce_str"] = order.NonceStr
  32. m["body"] = order.Body
  33. m["detail"] = order.Detail
  34. m["attach"] = order.Attach
  35. m["out_trade_no"] = order.OutTradeNo
  36. m["total_fee"] = order.TotalFee
  37. m["spbill_create_ip"] = order.SpbillCreateIP
  38. m["notify_url"] = order.NotifyURL
  39. m["trade_type"] = `PAP`
  40. m["contract_id"] = order.ContractID
  41. m["openid"] = order.OpenID
  42. m["mobile"] = order.Mobile
  43. m["creid"] = order.Creid
  44. m["timestamp"] = order.Timestamp
  45. var data []byte
  46. order.Sign = Sign(m, config.Key)
  47. if data, err = xml.Marshal(order); err != nil {
  48. return
  49. }
  50. reply, err = post(WePayHost+WePayURLPapPay, data)
  51. return
  52. }
  53. /*
  54. POST
  55. <xml>
  56. <mch_id>10000098</mch_id>
  57. <appid>wxcbda96de0b165486</appid>
  58. <nonce_str>5K8264ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
  59. <sign>C380BEC2BFD727A4B6845133519F3AD6</sign>
  60. <body>水电代扣</body>
  61. <out_trade_no>217752501201407033233368018</out_trade_no>
  62. <total_fee>888</total_fee>
  63. <spbill_create_ip>8.8.8.8</spbill_create_ip>
  64. <notify_url>http://yoursite.com/wxpay.html</notify_url>
  65. <contract_id>Wx15463511252015071056489715</contract_id>
  66. </xml>
  67. Return
  68. <xml>
  69. <return_code><![CDATA[SUCCESS]]></return_code>
  70. <return_msg><![CDATA[OK]]></return_msg>
  71. <appid><![CDATA[wxcbda96de0b165486]]></wxappid>
  72. <mch_id><![CDATA[10000098]]></mch_id>
  73. <nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
  74. <sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
  75. <result_code><![CDATA[SUCCESS]]></result_code>
  76. </xml>
  77. // */