微信掃碼找零(現金紅包)開發

近期公司在開發微信現金紅包功能,這裏記錄一下開發過程中遇到的坑,和一些領悟。

要實現微信掃碼找零(現金紅包),首先必須申請一個商戶號。本文采用的是服務商模式的商戶號,給客戶(子商戶)開通。

但是開通現金紅包條件不簡單,我們先看一下官方說明。

單單是上面的入駐超過90天,聯繫交易30就很難滿足(因爲客戶已開通微信支付,就需要使用)。

後來瞭解到只需要申請結算週期爲T+7的商戶號,就能夠直接使用了。

於是乎,解決了最大的問題,接下來就是開發了,下面是部分代碼,供參考。

1. 準備請求參數

PayRedPackBean.java

package com.pay.wechat.bo.redpack.bean;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

import com.dlys.pay.wechat.util.Signature;
import com.tenet.util.uuid.UUIDUtil19;

/**
 * 現金紅包實體
 * 
 * @author libaibai
 * @version 1.0 
 */
public class PayRedPackBean {

	public String nonce_str = UUIDUtil19.uuid();
	public String sign;
	public String mch_billno; // 商戶訂單號,接口根據商戶訂單號支持重入,如出現超時可再調用
	public String mch_id; // 商戶號
	public String sub_mch_id; // 子商戶號

	// 微信分配的公衆賬號ID(企業號corpid即爲此appId)。接口傳入的所有appid應該爲公衆號的appid
	public String wxappid;

	// 服務商模式下觸達用戶時的appid(可填服務商自己的appid)
	public String msgappid;

	public String send_name; // 紅包發送者名稱
	public String re_openid; // 接受紅包的用戶 ,服務商模式下可填入msgappid下的openid。
	public int total_amount; // 付款金額,單位份
	public int total_num = 1;// 發放人總數

	public String wishing; // 紅包祝福語
	public String client_ip; // 調用接口的機器Ip地址
	public String act_name; // 活動名稱
	public String remark; // 備註

	public String scene_id = "PRODUCT_1"; // 場景id,發放紅包使用場景,紅包金額大於200或者小於1元時必傳

	public PayRedPackBean(String mch_billno, String mch_id, String sub_mch_id, String wxappid,
			String msgappid, String send_name, String re_openid, int total_amount, String wishing,
			String client_ip, String act_name, String remark, String key) {
		this.mch_billno = mch_billno;
		this.mch_id = mch_id;
		this.sub_mch_id = sub_mch_id;
		this.wxappid = wxappid;
		this.msgappid = msgappid;
		this.send_name = send_name;
		this.re_openid = re_openid;
		this.total_amount = total_amount;
		this.wishing = wishing;
		this.client_ip = client_ip;
		this.act_name = act_name;
		this.remark = remark;
		this.sign = Signature.getSign(toMap(), key);
	}

	public String getNonce_str() {
		return nonce_str;
	}

	public void setNonce_str(String nonce_str) {
		this.nonce_str = nonce_str;
	}

	public String getSign() {
		return sign;
	}

	public void setSign(String sign) {
		this.sign = sign;
	}

	public String getMch_billno() {
		return mch_billno;
	}

	public void setMch_billno(String mch_billno) {
		this.mch_billno = mch_billno;
	}

	public String getMch_id() {
		return mch_id;
	}

	public void setMch_id(String mch_id) {
		this.mch_id = mch_id;
	}

	public String getSub_mch_id() {
		return sub_mch_id;
	}

	public void setSub_mch_id(String sub_mch_id) {
		this.sub_mch_id = sub_mch_id;
	}

	public String getWxappid() {
		return wxappid;
	}

	public void setWxappid(String wxappid) {
		this.wxappid = wxappid;
	}

	public String getMsgappid() {
		return msgappid;
	}

	public void setMsgappid(String msgappid) {
		this.msgappid = msgappid;
	}

	public String getSend_name() {
		return send_name;
	}

	public void setSend_name(String send_name) {
		this.send_name = send_name;
	}

	public String getRe_openid() {
		return re_openid;
	}

	public void setRe_openid(String re_openid) {
		this.re_openid = re_openid;
	}

	public int getTotal_amount() {
		return total_amount;
	}

	public void setTotal_amount(int total_amount) {
		this.total_amount = total_amount;
	}

	public int getTotal_num() {
		return total_num;
	}

	public void setTotal_num(int total_num) {
		this.total_num = total_num;
	}

	public String getWishing() {
		return wishing;
	}

	public void setWishing(String wishing) {
		this.wishing = wishing;
	}

	public String getClient_ip() {
		return client_ip;
	}

	public void setClient_ip(String client_ip) {
		this.client_ip = client_ip;
	}

	public String getAct_name() {
		return act_name;
	}

	public void setAct_name(String act_name) {
		this.act_name = act_name;
	}

	public String getRemark() {
		return remark;
	}

	public void setRemark(String remark) {
		this.remark = remark;
	}

	public String getScene_id() {
		return scene_id;
	}

	public void setScene_id(String scene_id) {
		this.scene_id = scene_id;
	}

	public Map<String, Object> toMap() {
		Map<String, Object> map = new HashMap<String, Object>();
		Field[] fields = this.getClass().getDeclaredFields();
		for (Field field : fields) {
			Object obj;
			try {
				obj = field.get(this);
				if (obj != null) {
					map.put(field.getName(), obj);
				}
			} catch (IllegalArgumentException e) {
			} catch (IllegalAccessException e) {
			}
		}
		return map;
	}
}
        public static String SENDREDPACK_URL = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";

	/**
	 * 發送現金紅包
	 * 
	 * @param payRedPackBean 這個數據對象裏面包含了API要求提交的各種數據字段
	 * @return API返回的數據
	 * @throws Exception
	 */
	public String requestRedPack(PayRedPackBean payRedPackBean) throws Exception {
		
		super.apiURL = Config.SENDREDPACK_URL;
		// --------------------------------------------------------------------
		// 發送HTTPS的Post請求到API地址
		// --------------------------------------------------------------------
		String responseString = sendPost(payRedPackBean);
		return responseString;
	}
	
	/**
	 * 發送紅包工具類
	 * 
	 * @param mch_billno 訂單號UUID
	 * @param appid
	 * @param mch_id
	 * @param sub_mch_id
	 * @param openId 接受人openId
	 * @param key
	 * @param send_name 發紅包人名稱
	 * @param total_amount
	 * @param client_ip
	 * @return
	 */
	public Map<String, Object> send(String mch_billno, String appid, String mch_id,
			String sub_mch_id, String openId, String key, String send_name, int total_amount) {

		String wishing = "找零";
		String act_name = "找零";
		String remark = "找零";
		String client_ip = "127.0.0.1";
		PayRedPackBean data = new PayRedPackBean(mch_billno, mch_id, sub_mch_id, appid, appid,
				send_name, openId, total_amount, wishing, client_ip, act_name, remark, key);
		try {
			String xmlMsg = scanPayService.requestRedPack(data);
			LOG.info("PayPackUtil-發送現金紅包微信響應,xmlMsg=" + xmlMsg + ",send_name=" + send_name);
			return XMLParser.getMapFromXML(xmlMsg);

		} catch (Exception e) {
			LOG.error("請求微信紅包時出錯!", e);
			return null;
		}
	}

 

特別注意:本人向微信瞭解過,商戶號是用戶收錢的,不能僅僅用於發紅包的,所有大家如果申請的商戶號只用於發紅包的話,就要特別注意了,一不小心就被風控了(本人未驗證,有驗證的同學也可以告訴我答案)

好了,接下來就可以愉快的使用微信掃碼找零了,媽媽再也不用擔心現金不夠了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章