メッセージを残して転送することを歓迎します
WeChat スピード開発シリーズの記事: ここをクリックしてください
前回の記事では WeChat 決済について紹介しました。 公式アカウント支払い、WeChat スキャンコード支払い、カード支払い、WeChat 支払い
この記事では、WeChat 加盟店の支払いツール - 現金赤い封筒について説明します
[公式ドキュメント]
1. 現金封筒の権限を有効化します
現金封筒を使用する前に、現金封筒機能をアクティブ化してください。操作パス: [WeChat 支払いマーチャント プラットフォームにログイン—>プロダクト センター—>現金赤い封筒—>アクティブ化]。
2. API証明書をダウンロードします
販売者がWeChat red封筒インターフェースを呼び出すと、サーバーは証明書の検証を実行します
たくさんの証明書でどれを使用すればよいか尋ねたい人はいますか?開発言語と何か関係があるのでしょうか?
どの言語がどの証明書を使用しますか? スクリーンショットの Certificate description.txt
を参照してください。 证书说明.txt
内容如下:
欢迎使用微信支付! 微信支付API共四份(证书pkcs12格式、证书pem格式、证书密钥pem格式、CA证书),为接口中强制要求时需携带的证书文件。 证书属于敏感信息,请妥善保管不要泄露和被他人复制。 不同开发语言下的证书格式不同,以下为说明指引: 证书pkcs12格式(apiclient_cert.p12) 包含了私钥信息的证书文件,为p12(pfx)格式,由微信支付签发给您用来标识和界定您的身份 部分安全性要求较高的API需要使用该证书来确认您的调用身份 windows上可以直接双击导入系统,导入过程中会提示输入证书密码,证书密码默认为您的商户ID(如:10010000) 证书pem格式(apiclient_cert.pem) 从apiclient_cert.p12中导出证书部分的文件,为pem格式,请妥善保管不要泄漏和被他人复制 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 您也可以使用openssl命令来自己导出:openssl pkcs12 -clcerts -nokeys -in apiclient_cert.p12 -out apiclient_cert.pem 证书密钥pem格式(apiclient_key.pem) 从apiclient_cert.p12中导出密钥部分的文件,为pem格式 部分开发语言和环境,不能直接使用p12文件,而需要使用pem,所以为了方便您使用,已为您直接提供 您也可以使用openssl命令来自己导出:openssl pkcs12 -nocerts -in apiclient_cert.p12 -out apiclient_key.pem CA证书(rootca.pem) 微信支付api服务器上也部署了证明微信支付身份的服务器证书,您在使用api进行调用时也需要验证所调用服务器及域名的真实性 该文件为签署微信支付证书的权威机构的根证书,可以用来验证微信支付服务器证书的真实性 某些环境和工具已经内置了若干权威机构的根证书,无需引用该证书也可以正常进行验证,这里提供给您在未内置所必须根证书的环境中载入使用
三、充值
在发放现金红包之前,请确保你的资金充足。如若不足,请充值。操作路径:【登录商户平台——>账户中心——>资金管理——>充值】
每个红包的平均金额必须在1.00元到200.00元之间
四、获取openid
目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见之前写的文章:极速开发微信公众号之授权获取用户信息
五、相关参数设置
和红包相关的参数【主要是安全方面:绑定IP、防止用户盗刷】,你可以在页面上自主设置和更改。
操作路径如下:【登录商户平台——>产品中心——>现金红包——>产品设置】(注:“产品设置”操作按钮仅当你开通现金红包功能之后才会出现)。
你可以设置和更改以下参数:
说明:
1、 调用IP地址:设置之后,仅有已设置的IP地址可以调用,其余的IP调用会报错;
2、用户领取上限:限制同一openid同一日领取的个数
3、防刷等级:防刷是指微信风控针对微信小号、僵尸号、机器号等的拦截,你可以通过更改防刷等级控制防刷的强度。
4、 同时,你也可以申请更改红包额度。但是需要经过微信支付的审核,审核通过之后才会生效。
现金红包分为两类:
1、普通红包 【官方文档】
2、裂变红包 【官方文档】两者部分参数不同
1、发送普通红包接口 com.javen.weixin.api.RedPackApi.java
private static String sendRedPackUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack"; /** * 发送红包 * @param params 请求参数 * @param certPath 证书文件目录 * @param partner 证书密码 * @return {String} */ public static String sendRedPack(Map<String, String> params, String certPath, String partner) { return HttpUtils.postSSL(sendRedPackUrl, PaymentKit.toXml(params), certPath, partner); }
2、发送裂变红包接口 com.javen.weixin.api.RedPackApi.java
private static String sendGroupRedPackUrl = "api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack"; /** * 发送裂变红包 * @param params 请求参数 * @param certPath 证书文件目录 * @param partner 证书密码 * @return {String} */ public static String sendGroupRedPack(Map<String, String> params, String certPath, String partner) { return HttpUtils.postSSL(sendGroupRedPackUrl, PaymentKit.toXml(params), certPath, partner); }
具体实现封装 com.javen.utils.ReadPackUtils.java
1、普通红包
/** * 发送普通红包 * @param request 获取IP * @param total_amount 付款现金(单位分) * @param total_num 红包发放总人数 * @param wishing 红包祝福语 * @param act_name 活动名称 * @param remark 备注 * @param reOpenid 用户openid * @param partner 商户号 * @param wxappid 公众账号appid * @param sendName 商户名称 * @param paternerKey 商户签名key * @param certPath 证书路径 * @return */ public static boolean sendredpack(HttpServletRequest request,String total_amount,String total_num,String wishing,String act_name,String remark,String reOpenid,String partner,String wxappid,String sendName,String paternerKey,String certPath) { // 商户订单号 String mchBillno = System.currentTimeMillis() + ""; String ip = IpKit.getRealIp(request); Map<String, String> params = new HashMap<String, String>(); // 随机字符串 params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); // 商户订单号 params.put("mch_billno", mchBillno); // 商户号 params.put("mch_id", partner); // 公众账号ID params.put("wxappid", wxappid); // 商户名称 params.put("send_name", sendName); // 用户OPENID params.put("re_openid", reOpenid); // 付款现金(单位分) params.put("total_amount", total_amount); // 红包发放总人数 params.put("total_num", total_num); // 红包祝福语 params.put("wishing", wishing); // 终端IP params.put("client_ip", ip); // 活动名称 params.put("act_name", act_name ); // 备注 params.put("remark", remark); //创建签名 String sign = PaymentKit.createSign(params, paternerKey); params.put("sign", sign); String xmlResult = RedPackApi.sendRedPack(params, certPath, partner); Map<String, String> result = PaymentKit.xmlToMap(xmlResult); log.warn(JsonKit.toJson(result)); //此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 String return_code = result.get("return_code"); //业务结果 String result_code = result.get("result_code"); if (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) { return false; } if (StrKit.notBlank(result_code) && "SUCCESS".equals(result_code)) { return true; } return false; }
2、裂变红包
/** * 发送裂变红包 * @param partner * @param wxappid * @param sendName * @param reOpenid * @param total_amount * @param total_num * @param wishing * @param act_name * @param remark * @param paternerKey * @param certPath * @return */ public static boolean sendGroupRedPack(String partner, String wxappid, String sendName, String reOpenid, String total_amount, String total_num, String wishing, String act_name, String remark, String paternerKey, String certPath){ // 商户订单号 String mchBillno = System.currentTimeMillis() + ""; Map<String, String> params = new HashMap<String, String>(); // 随机字符串 params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); // 商户订单号 params.put("mch_billno", mchBillno); // 商户号 params.put("mch_id", partner); // 公众账号ID params.put("wxappid", wxappid); // 商户名称 params.put("send_name", sendName); // 用户OPENID params.put("re_openid", reOpenid); // 付款现金(单位分) params.put("total_amount", total_amount); // 红包发放总人数 params.put("total_num", total_num); //红包金额设置方式 params.put("amt_type", "ALL_RAND"); // 红包祝福语 params.put("wishing", wishing); // 活动名称 params.put("act_name", act_name ); // 备注 params.put("remark", remark); //创建签名 String sign = PaymentKit.createSign(params, paternerKey); params.put("sign", sign); String xmlResult = RedPackApi.sendGroupRedPack(params, certPath, partner); Map<String, String> result = PaymentKit.xmlToMap(xmlResult); log.warn(JsonKit.toJson(result)); //此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断 String return_code = result.get("return_code"); //业务结果 String result_code = result.get("result_code"); if (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) { return false; } if (StrKit.notBlank(result_code) && "SUCCESS".equals(result_code)) { return true; } return false; }
/** * 微信红包demo * @author Javen * 2016年5月28日 */ public class RedPackApiController extends Controller { private static String sendName = "Javen205"; //微信证书路径 private static String certPath = "/Users/Javen/Downloads/cert/apiclient_cert.p12"; //商户相关资料 String wxappid = PropKit.get("appId"); // 微信支付分配的商户号 String partner = PropKit.get("mch_id"); //API密钥 String paternerKey = PropKit.get("paternerKey"); /** * 发送普通红包 */ public void sendredpack() { boolean isSend = ReadPackUtils.sendredpack(getRequest(), "100", "1", "感谢您参加猜灯谜活动,祝您元宵节快乐!", "猜灯谜抢红包活动", "猜越多得越多,快来抢!", "o_pncsidC-pRRfCP4zj98h6slREw", partner, wxappid, sendName, paternerKey, certPath); renderJson(isSend); } /** * 发送裂变红包 */ public void sendGroupRedPack() { boolean isSend = ReadPackUtils.sendGroupRedPack(partner, wxappid, "天虹百货", "o_pncsidC-pRRfCP4zj98h6slREw", "100", "10", "感谢您参加猜灯谜活动,祝您元宵节快乐!", "猜灯谜抢红包活动", "猜越多得越多,快来抢", paternerKey, certPath); renderJson(isSend); } public void query() { String query = ReadPackUtils.query("10000098201411111234567890", partner, wxappid, paternerKey, certPath); renderJson(query); } }
【查询红包记录官方文档】
接口封装com.javen.weixin.api.RedPackApi.java
private static String getHBInfo = "api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo "; /** * 根据商户订单号查询信息 * @param params 请求参数 * @param certPath 证书文件目录 * @param partner 证书密码 * @return {String} */ public static String getHbInfo(Map<String, String> params, String certPath, String partner) { return HttpUtils.postSSL(getHBInfo, PaymentKit.toXml(params), certPath, partner); }
具体实现封装 com.javen.utils.ReadPackUtils.java
/** * 根据商户订单号查询红包 * @param mch_billno 商户订单号 * @param partner 商户号 * @param wxappid 公众账号ID * @param paternerKey 商户签名Key * @param certPath 证书路径 * @return */ public static String query(String mch_billno,String partner,String wxappid,String paternerKey,String certPath) { Map<String, String> params = new HashMap<String, String>(); // 随机字符串 params.put("nonce_str", System.currentTimeMillis() / 1000 + ""); // 商户订单号 params.put("mch_billno", mch_billno); // 商户号 params.put("mch_id", partner); // 公众账号ID params.put("appid", wxappid); params.put("bill_type", "MCHT"); //创建签名 String sign = PaymentKit.createSign(params, paternerKey); params.put("sign", sign); String xmlResult = RedPackApi.getHbInfo(params, certPath, partner); Map<String, String> result = PaymentKit.xmlToMap(xmlResult); System.out.println(result); return JsonKit.toJson(result); }
各赤い封筒の平均金額は1.00元から200.00元の間である必要があります
現金赤封筒-recharge.png4. 現在、openid の取得をサポートしています。 WeChat ユーザーの openid は、指定された金額の赤い封筒を発行します。 (openid の取得については、以前に書いた記事を参照してください: ユーザー情報を取得するための WeChat パブリック アカウント認証を迅速に開発する
🎜 5. 関連パラメータ設定 🎜🎜 と赤い封筒に関連するパラメータ [主にセキュリティ面: IP のバインド、ユーザーの盗用の防止] ] を選択すると、ページ上で個別に設定および変更できます。 🎜操作パスは次のとおりです: [マーチャント プラットフォームにログイン—>プロダクト センター—>キャッシュ レッド パケット—>商品設定] (注) : 「製品設定」操作 ボタン 🎜 は、現金封入機能 🎜 を有効にした後にのみ表示されます。次のパラメータを設定および変更できます: 🎜🎜🎜🎜🎜Cash Red Packet- Set Parameters.png🎜🎜手順: 🎜1. IP アドレスを呼び出す: 設定後は、設定された IP アドレスのみを呼び出すことができ、他の IP 呼び出しはエラーを報告します。 🎜2. 受信した同じ openid の数を制限します。 3. アンチブラッシングレベル: アンチブラッシングとは、WeChat アカウント、ゾンビアカウント、マシンアカウントなどの傍受を対象としたリスクコントロールを指します。アンチスワイプの強度を変更することで、アンチスワイプの強度を制御できます。 🎜4. 同時に赤い封筒の金額の変更を申請することもできますが、WeChatcom.javen.RedPackApi.java を送信します。
🎜rrreee🎜2. フィッションレッドエンベロープインターフェイスを送信しますcom.javen.weixin.api.RedPackApi.java
🎜rrreee🎜特定の実装パッケージcom.javen.utils .ReadPackUtils.java
🎜1. 普通の赤い封筒🎜rrreee🎜2. 分裂の赤い封筒🎜rrreee🎜赤い封筒のデモ🎜rrreee🎜赤い封筒の記録をクエリ🎜🎜【赤い封筒の記録公式ドキュメントをクエリ】🎜🎜インターフェースパッケージcom .javen.weixin.api.RedPackApi.java
🎜rrreee🎜特定の実装パッケージ com.javen.utils.ReadPackUtils.java
🎜rrreee🎜[関連する推奨事項]🎜🎜1.アカウント プラットフォームのソース コードのダウンロード🎜🎜🎜2. 🎜WeChat 投票のソース コード🎜🎜🎜3. 🎜WeChat People King v3.4.5 Advanced Business Edition WeChat ルービック キューブのソース コード🎜🎜以上がWeChat 公開アカウントで現金封筒を開発する方法に関するサンプル チュートリアルを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。