【微信公众号发红包转账】微信公众号上手机网页接收请求,通过公众号给用户发红包 开发流程
2017-09-12 17:11
495 查看
有了微信支付 的开发做铺垫,相关的微信其他业务处理起来逻辑就能清晰很多。
准备好这两个架包
View Code
----------------------------------------------------------------------------------------------至此,微信公众号 发送红包 【待完善】---------------------------------------------------------------
准备好这两个架包
package net.shopxx.wx.pay; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import javax.net.ssl.SSLContext; import javax.security.cert.CertificateException; import javax.servlet.http.HttpServletRequest; import org.apache.commons.codec.digest.DigestUtils; import org.apache.http.ssl.SSLContexts; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; /** * 微信支付 微信公众号发红包 * 工具类 * @author SXD * */ public class WeXinUtil { /** * 获取用户IP * @param request * @return */ public static String getIp(HttpServletRequest request){ String ipAddress = null; if (request.getHeader("x-forwarded-for") == null) { ipAddress = request.getRemoteAddr(); }else{ if(request.getHeader("x-forwarded-for").length() > 15){ String [] aStr = request.getHeader("x-forwarded-for").split(","); ipAddress = aStr[0]; } else{ ipAddress = request.getHeader("x-forwarded-for"); } } return ipAddress; } /** * 签名算法,生成统一下单中 必填项签名 * @param unifiedOrder 1.将统一下单实体中各个字段拼接 2.MD5加密 3.全部转化为大写 * @return 返回经过签名算法生成的签名 sign * 第一步的规则 * ◆ 参数名ASCII码从小到大排序(字典序); * ◆ 如果参数的值为空不参与签名; * ◆ 参数名区分大小写; * ◆ 验证调用返回或微信主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 * ◆ 微信接口可能增加字段,验证签名时必须支持增加的扩展字段 */ /* 手动拼接方式 public String createUnifiedOrderSign(Unifiedorder unifiedOrder){ StringBuffer sign = new StringBuffer(); sign.append("appid=").append(unifiedOrder.getAppid()); sign.append("&body=").append(unifiedOrder.getBody()); sign.append("&mch_id=").append(unifiedOrder.getMch_id()); sign.append("&nonce_str=").append(unifiedOrder.getNonce_str()); sign.append("¬ify_url=").append(unifiedOrder.getNotify_url()); sign.append("&openid=").append(unifiedOrder.getOpenid()); sign.append("&out_trade_no=").append(unifiedOrder.getOut_trade_no()); sign.append("&spbill_create_ip=").append(unifiedOrder.getSpbill_create_ip()); sign.append("&total_fee=").append(unifiedOrder.getTotal_fee()); sign.append("&trade_type=").append(unifiedOrder.getTrade_type()); sign.append("&key=").append(KEY); return DigestUtils.md5Hex(sign.toString()).toUpperCase(); } */ /** * 拼接生成sign 签名 * @param unifiedOrder * @param KEY * @return * @throws Exception */ public static String createUnifiedOrderSign(Object object,String KEY) throws Exception{ StringBuffer sign = new StringBuffer(); Map<String, String> map = getSortMap(object); boolean isNotFirst = false; for (Map.Entry<String, String> entry : map.entrySet()) { if(isNotFirst == true){ sign.append("&"); }else{ isNotFirst = true; } sign.append(entry.getKey()).append("=").append(entry.getValue()); } sign.append("&key=").append(KEY); return DigestUtils.md5Hex(sign.toString()).toUpperCase(); } /** * 使用java反射机制,动态获取对象的属性和参数值,排除值为null的情况,并按字典序排序 * @param object * @return * @throws Exception */ private static Map<String, String> getSortMap(Object object) throws Exception{ Field[] fields = object.getClass().getDeclaredFields(); Map<String, String> map = new HashMap<String, String>(); for(Field field : fields){ String name = field.getName(); String methodName = "get" + name.replaceFirst(name.substring(0, 1), name.substring(0, 1) .toUpperCase()); // 调用getter方法获取属性值 // Method getter = object.getClass().getMethod(methodName); // String value = getter.invoke(object)+""; field.setAccessible(true); Object value = field.get(object); if (value != null){ map.put(name, value.toString()); } } Map<String, String> sortMap = new TreeMap<String, String>( new Comparator<String>() { @Override public int compare(String arg0, String arg1) { return arg0.compareTo(arg1); } }); sortMap.putAll(map); return sortMap; } public static SSLContext getSSL() throws KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException, KeyManagementException, java.security.cert.CertificateException { KeyStore keyStore = KeyStore.getInstance("PKCS12"); //证书位置 放在自己的项目下面 Resource resource = new ClassPathResource("apiclient_cert.p12"); InputStream instream = resource.getInputStream(); try { keyStore.load(instream, "填写证书密码,默认为商户号".toCharArray()); } finally { instream.close(); } SSLContext sslcontext = SSLContexts.custom() .loadKeyMaterial(keyStore, "填写证书密码,默认为商户号".toCharArray()) .build(); return sslcontext; } }
View Code
----------------------------------------------------------------------------------------------至此,微信公众号 发送红包 【待完善】---------------------------------------------------------------
相关文章推荐
- Django微信公众号开发(一)公众号内网页授权登录后微信获取用户信息
- Android 高德地图开发,手机显示用户MD5安全码未通过
- (Java)微信之个人公众账号开发(二)——接收并处理用户消息(下)
- 【公众号开发】开启微信公众号开发者模式接收消息
- 微信公众号接收消息和发送消息开发流程和注意事项
- 微信公众号可通过现金红包接口发放微信支付现金红包(附开发教程)
- (微信公众号开发《一》OAuth2.0网页授权认证获取用户的详细信息,实现自动登陆)http://blog.csdn.net/liaohaojian/article/details/70175835
- 公众获取用户地理位置-php开发微信公众号
- 微信公众号开发之网页授权获取用户基本信息
- 微信公众号开发-微信网页授权获取用户openid以及用户信息的步骤
- C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取
- .net平台手机管理软件开发(12)—— 短信部分 通过RS232发送和接收短信
- 微信公众号开发系列-网页授权获取用户基本信息
- 微信公众号用户分组,新建公众号用户分组,php开发公众号
- 公众平台测试帐号开发全流程第7篇-用户管理
- 微信公众号开发系列-网页授权获取用户基本信息
- 基于Springboot的微信公众号接入、通过网页授权机制获取用户信息
- 微信公众号开发系列-网页授权获取用户基本信息
- 使用WX-SDK开发微信公众号(一) 接收处理来自微信用户的消息
- Ruby on Rails微信开发4——通过网页授权获取用户的基本信息