您的位置:首页 > 移动开发 > 微信开发

【微信公众号发红包转账】微信公众号上手机网页接收请求,通过公众号给用户发红包 开发流程

2017-09-12 17:11 495 查看
有了微信支付 的开发做铺垫,相关的微信其他业务处理起来逻辑就能清晰很多。

准备好这两个架包

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

----------------------------------------------------------------------------------------------至此,微信公众号 发送红包 【待完善】---------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐