JAVA实现微信App支付(二)

6 篇文章 0 订阅
2 篇文章 0 订阅

以前说了微信公众号支付 然而微信公众App支付和微信公众号类似如果你看了开发文档的话。

只需要调用这个方法就可以了


/**
 * 微信支付工具类
 * @ClassName: WeixiPayUtil 
 * @Description: 微信支付工具
 * @author Administrator
 * @date 2017年4月28日 下午12:02:12 
 *
 */
public class WeixinPayUtil {
    private static Logger logger = LoggerFactory.getLogger(WeixinPayUtil.class);
    public static final String RETURN_CODE_SUCC = "SUCCESS";
    public static final String RETURN_CODE_FAIL = "FAIL";
    protected static HttpServletRequest request = ServletActionContext.getRequest();
    protected static HttpServletResponse response = ServletActionContext.getResponse();

    public static SortedMap<String,String> getOrderInfoMap(Map<String, Object> mrsInfo,  List<Map<String, Object>> productList){

        SortedMap<String,String> orderInfo = new TreeMap<String, String>();

        orderInfo.put("userId", mrsInfo.get("userId").toString());
        orderInfo.put("orderNum", mrsInfo.get("orderNum").toString());
        orderInfo.put("orderMoney", mrsInfo.get("allMoney").toString());

        String subject = "",body="";
        int bookCount = 0;
        if(productList!=null && productList.size()>0){
            for (Map<String, Object> shopOrderDetail : productList) {
                subject = subject + shopOrderDetail.get("productName") + " , ";
                bookCount = bookCount + StrUtil.getIntValue(shopOrderDetail.get("productCount").toString());
            }
        }

        if(subject.contains(",")){
            if(subject.length()>25){
                subject = subject.substring(0,25)+"......";
            } 
            subject = subject.substring(0,subject.length()-3);// 去掉最后一个,号或者最后一个.号
        }

        body = "订单:"+mrsInfo.get("orderNum")+" 共包含"+bookCount+"件商品。";

        orderInfo.put("body", body);
        orderInfo.put("detail", subject);

        return orderInfo;
    }

/**
     * 获取APP预支付ID
     * @param request
     * @param response
     * @param orderInfo 包括字段orderNum,orderMoney(单位:分),myNotifyUrl(自定义回调地址时,可空),detail(可空),body
     * @return
     */
    public static String getWxAppPrepayId(HttpServletRequest request, HttpServletResponse response, Map<String, String> orderInfo, TSysWxPayConfigCustom wxPayConfigCustom, String notifyUrl){
        String methodName = "getWxAppPrepayId";

        // 网页授权后获取传递的参数
        String myNotifyUrl = orderInfo.get("myNotifyUrl");  
        String orderNum = orderInfo.get("orderNum"); 
        String orderMoney = orderInfo.get("orderMoney");
        // 商品描述
        String body = orderInfo.get("body");
        String detail = orderInfo.get("detail");

        String prepayId = getAppPrepayIdRedis(orderNum);
        if (StringUtil.isNotEmpty(prepayId)) {
            return prepayId;
        }

        if(StringUtil.isEmptyAnyOf(orderNum, orderMoney, body)){
            logger.error(getClassName() +"类"+ methodName +"方法中orderNum,orderMoney,body参数必须都不为空!");
            return "-1";
        }

        // 金额转化为分为单位
        float sessionmoney = Float.parseFloat(orderMoney);
        String finalmoney = String.format("%.2f", sessionmoney);
        String total_fee = Integer.parseInt(finalmoney.replace(".", "")) + "";
        // 商户相关资料 
        String appid = wxPayConfigCustom.getOpenAppId();
        String appsecret = wxPayConfigCustom.getOpenSecret();
        String partnerkey = wxPayConfigCustom.getOpenKey();

        // 商户号
        String mch_id = wxPayConfigCustom.getOpenMchId();
        // 随机数 
        String nonce_str = Sha1Util.getNonceStr();
        // 附加数据
        logger.info(getClassName() +"类"+ methodName +"方法中myNotifyUrl="+ myNotifyUrl);
        String attach = getAttachKey(orderNum, myNotifyUrl);
        // 商户订单号
        String out_trade_no = orderNum;
        // 订单生成的机器 IP
        String spbill_create_ip = request.getRemoteAddr();

        // 这里notify_url是 支付完成后微信发给该链接信息,可以判断会员是否支付成功,改变订单状态等。
        String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
        String notify_url = url;
        if (StringUtil.isEmpty(notifyUrl)) {
            notify_url += WeixinConfig.notify_url;
        } else {
            notify_url += notifyUrl;
        } 
        String  trade_type = WeixinConfig.trade_type_app;   

        SortedMap<String, String> packageParams = new TreeMap<String, String>();
        packageParams.put("appid", appid);  
        packageParams.put("mch_id", mch_id);  
        packageParams.put("nonce_str", nonce_str);  
        packageParams.put("body", body);  
        if (StringUtil.isNotEmpty(detail)) {
            packageParams.put("detail", detail);
        }
        packageParams.put("attach", attach);  
        packageParams.put("out_trade_no", out_trade_no);  

        packageParams.put("total_fee", total_fee);  
        packageParams.put("spbill_create_ip", spbill_create_ip);  
        packageParams.put("notify_url", notify_url);  
        packageParams.put("trade_type", trade_type);  

        RequestHandler reqHandler = new RequestHandler(request, response);
        reqHandler.init(appid, appsecret, partnerkey);

        String sign = reqHandler.createSign(packageParams);
        String xml = "<xml>" + "<appid>" + appid + "</appid>" 
                + "<mch_id>" + mch_id + "</mch_id>" 
                + "<nonce_str>" + nonce_str + "</nonce_str>" 
                + "<sign>" + sign + "</sign>" 
                + "<body><![CDATA[" + body + "]]></body>";
        if (StringUtil.isNotEmpty(detail)) {
            xml += "<detail><![CDATA[" + detail + "]]></detail>";
        }
        xml += "<attach>" + attach + "</attach>" 
                + "<out_trade_no>" + out_trade_no + "</out_trade_no>" 
                + "<total_fee>" + total_fee + "</total_fee>" 
                + "<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>"
                + "<notify_url>" + notify_url + "</notify_url>" 
                + "<trade_type>" + trade_type + "</trade_type>"
                + "</xml>";

        logger.info(getClassName()+"类 "+ methodName +"方法,xml="+ xml);

        String createOrderURL = WeixinConfig.prepay_url;
        try {
            prepayId = GetWxOrderno.getPayNo(createOrderURL, xml);
            setAppPrepayIdRedis(orderNum, prepayId);

            logger.info(getClassName()+"类 "+ methodName +"方法中生成 prepayId="+prepayId+"||orderNum="+orderNum);
        } catch (Exception e) {
            logger.error(getClassName()+"类 "+ methodName +"方法中生成 prepayId 出错了", e);
            e.printStackTrace();
        }
        return prepayId;
    }
   }



package com.shopn.util;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.json.JSONObject;
public class weixiPayUtil {
public static Map<String,String> createWxAppSignByPrepayId(HttpServletRequest request, HttpServletResponse response, String prepayId, TSysWxPayConfigCustom wxPayConfigCustom){
        SortedMap<String, String> finalpackage = new TreeMap<String, String>();
        String appid = WeixinpayConfig.wxappappid;
        String appsecret = WeixinpayConfig.wxappappsecret;
        String partner = WeixinpayConfig.wxapppartner;
        String partnerkey = WeixinpayConfig.wxapppartnerkey;
        if(wxPayConfigCustom!=null){
            if(!StringUtil.isEmptyOrNullStr(wxPayConfigCustom.getOpenAppId())){
                appid = wxPayConfigCustom.getOpenAppId();
                appsecret = wxPayConfigCustom.getOpenSecret();
                partner = wxPayConfigCustom.getOpenMchId();
                partnerkey = wxPayConfigCustom.getOpenKey();
            }
        }

        logger.info("createWxAppSignByPrepayId 方法中生成 appid="+appid+"|appsecret="+appsecret+"|partner"+partner+"||partnerkey="+partnerkey);

        String nonce_str = Sha1Util.getNonceStr();
        String timestamp = Sha1Util.getTimeStamp();
        String packages = "Sign=WXPay";
        finalpackage.put("appid", appid);
        finalpackage.put("partnerid", partner);
        finalpackage.put("prepayid", prepayId);
        finalpackage.put("noncestr", nonce_str);  
        finalpackage.put("timestamp", timestamp);  
        finalpackage.put("package", packages);  
        //finalpackage.put("signType", "MD5");

        RequestHandler reqHandler = new RequestHandler(request, response);
        reqHandler.init(appid, appsecret, partnerkey);

        String finalSign = reqHandler.createSign(finalpackage);
        logger.info("createSignByPrepayId方法中生成 finalSign "+finalSign);

        Map<String,String> map = new HashMap<String, String>();
        map.put("partnerId", partner);
        map.put("prepayId", prepayId);
        map.put("sign", finalSign);
        map.put("nonceStr", nonce_str);
        map.put("timeStamp", timestamp);
        map.put("appid", appid);
        return map;
    }

}

希望对开发微信支付的朋友有帮助。

版权声明:未经本人允许不得转载。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值