微信小程序支付

生成订单及支付


@Controller
@RequestMapping("/api/pay/")
public class PayApiController {
	//支付生成订单拉取微信支付
	@ResponseBody
	@RequestMapping("returnparam")
	public JSONObject doOrder(AgentOrder agentOrder,String itemInfo,String changeOpenId,Integer type,String shareOpenId) throws Exception{
		   JSONObject resultJson=new JSONObject();
		   Integer status=0;
		   if(itemInfo!=null){
			   JSONObject fromObject = JSONObject.fromObject(itemInfo);
			   JSONArray jsonArray = fromObject.getJSONArray("itemInfo");
			   AgentOrder order=new AgentOrder();
			   Factory factory=factoryService.getFactoryByOpenId(changeOpenId);
			   if(factory!=null){
//				   if(type!=2){
				   order.setFactoryId(factory.getId());//购买的用户 
				   order.setOrderPrice(agentOrder.getOrderPrice());
//				   System.out.println(agentOrder.getOrderPrice());
				   SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
				   String newDate=sdf.format(new Date());
				   String result="";
				   Random random=new Random();
				   for(int i=0;i<3;i++){
				     result+=random.nextInt(10);
			       }
				   order.setOrderSize(newDate+result);  //设置订单号 
				   order.setType(type);//订单类型 (1,工厂派发, 2客户自己下单, 3 进货 ,4工厂代发,5普通用户及分享客下单,6分享单)
				   order.setAddress(agentOrder.getAddress());
				   order.setLinkName(agentOrder.getLinkName());
				   order.setTelphone(agentOrder.getTelphone());
				   order.setFlowMoney(agentOrder.getFlowMoney());
				   order.setStatus(1);//初始订单未发货
				   order.setPayStatus(1);//初始订单未支付
				   if(shareOpenId!=null && !"".equals(shareOpenId)){
					   //根据分享人的openId 查询该用户 
					   order.setShareOpenId(shareOpenId);//分享人的openid
					   order.setLessPrice(0.0);
				   }
				   Integer add = agentOrderService.add(order);
				   //添加订单详情表
				   for (int i = 0; i < jsonArray.size(); i++) {
						JSONObject object = (JSONObject) jsonArray.get(i);
						JSONObject fromObject2 = JSONObject.fromObject(object);
						AgentOrderItem agentOrderItem=new AgentOrderItem();
						String itemId = fromObject2.getString("itemId");
						String itemtypepriceId=fromObject2.getString("itemtypepriceId");
						String num=fromObject2.getString("number");
						double price2=fromObject2.getDouble("price");
						agentOrderItem.setOrderId(order.getId());
						agentOrderItem.setItemId(Integer.parseInt(itemId));
						agentOrderItem.setItempricetypeId(Integer.parseInt(itemtypepriceId));
						agentOrderItem.setNum(Integer.parseInt(num));
						agentOrderItem.setPrice(price2);
						agentOrderItem.setCreateTime(new Timestamp(System.currentTimeMillis()));
						agentOrderItemService.add(agentOrderItem);
					}
					   
				   //时间戳
					String times = System.currentTimeMillis() +"";
					//订单标题(自定义)
					String title = "shoplist";
					//订单编号(自定义 这里以时间戳+随机数)
					SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
					packageParams.put("appid", ConstantURL.getApp_Id());//微信小程序ID
					packageParams.put("mch_id", ConstantURL.getMch_Id());//商户ID
					packageParams.put("nonce_str", times);//随机字符串(32位以内) 这里使用时间戳
					packageParams.put("body", title);//支付主体名称 自定义
					packageParams.put("out_trade_no", newDate+result);//编号 自定义以时间戳+随机数+商品ID
					Double price = agentOrder.getOrderPrice()*100;
					int payMoney = Integer.parseInt(price.toString().split("\\.")[0]); 
					packageParams.put("total_fee",payMoney);//价格 自定义
					packageParams.put("notify_url", "http://nh.yunbiaowulian.com/api/pay/buy.html");//支付返回地址要外网访问的到, localhost不行,调用下面buy方法。(订单存入数据库)
					packageParams.put("trade_type", "JSAPI");//这个api有,固定的
					packageParams.put("openid", changeOpenId);//用户的openid 可以要 可以不要
					//获取sign
					String sign = PayCommonUtil.createSign("UTF-8", packageParams, ConstantURL.getPublicKey());//最后这个是自己在微信商户设置的32位密钥
					packageParams.put("sign", sign);
//					System.out.println(sign);
					//转成XML
					String requestXML = PayCommonUtil.getRequestXml(packageParams);
//					System.out.println(requestXML);
					//得到含有prepay_id的XML
					String resXml = HttpUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", requestXML);
//					System.out.println(resXml);
					//解析XML存入Map
					Map map = XMLUtil.doXMLParse(resXml);
//					System.out.println(map);
					//String return_code = (String) map.get("return_code");
					//得到prepay_id
					String prepay_id = (String) map.get("prepay_id");
					SortedMap<Object, Object> packageP = new TreeMap<Object, Object>();
					packageP.put("appId", ConstantURL.getApp_Id());//!!!注意,这里是appId,上面是appid
					packageP.put("nonceStr", times);//时间戳
					packageP.put("package", "prepay_id=" + prepay_id);//必须把package写成 "prepay_id="+prepay_id这种形式
					packageP.put("signType", "MD5");//paySign加密
					packageP.put("timeStamp", (System.currentTimeMillis() / 1000) + "");
					//得到paySign
					String paySign = PayCommonUtil.createSign("UTF-8", packageP, ConstantURL.getPublicKey());
					packageP.put("paySign", paySign);
					status=1;
					resultJson.put("msg", "设置支付参数成功");
					resultJson.put("orderId", order.getId());
					//将packageP数据返回给小程序
			        JSONObject jsonObject1=JSONObject.fromObject(packageP);
			        resultJson.put("data", jsonObject1);
//				   }

				    status=1;
				    resultJson.put("changeOpenId", changeOpenId);
				    resultJson.put("msg", "提交订单成功");
			   }else{
				   status=3;
				   resultJson.put("changeOpenId", changeOpenId);
				   resultJson.put("msg", "参数错误");
			   } 
		   }else{
			   status=2;
			   resultJson.put("changeOpenId", changeOpenId);
			   resultJson.put("msg", "提交订单失败");
		   }
		   
		   resultJson.put("status", status);
		   return resultJson;
	}
	
	
	
	/**立即支付接口  2019-04-01
	 * (用于用户下单未支付所需)
	 * @param agentOrderId
	 * @param changeOpenId
	 * @return
	 * @throws Exception
	 */
	@ResponseBody
	@RequestMapping("uporder")
	public JSONObject upOrder(String agentOrderId,String changeOpenId) throws Exception{
		   JSONObject resultJson=new JSONObject();
		   Integer status=0;
		   //根据订单id查询
		   if(agentOrderId!=null &&!"".equals(agentOrderId)){
			   AgentOrder agentOrder = agentOrderService.getById(agentOrderId);
			   if(agentOrder!=null){
				   Factory factory=factoryService.getFactoryByOpenId(changeOpenId);
				   if(factory!=null){
					   SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
					   String newDate=sdf.format(new Date());
					   String result="";
					   Random random=new Random();
					   for(int i=0;i<3;i++){
						   result+=random.nextInt(10);
					   }
					   //时间戳
					   String times = System.currentTimeMillis() +"";
					   //订单标题(自定义)
					   String title = "shoplist";
					   //订单编号(自定义 这里以时间戳+随机数)
					   SortedMap<Object, Object> packageParams = new TreeMap<Object, Object>();
					   packageParams.put("appid", ConstantURL.getApp_Id());//微信小程序ID
					   packageParams.put("mch_id", ConstantURL.getMch_Id());//商户ID
					   packageParams.put("nonce_str", times);//随机字符串(32位以内) 这里使用时间戳
					   packageParams.put("body", title);//支付主体名称 自定义
					   packageParams.put("out_trade_no", newDate+result);//编号 自定义以时间戳+随机数+商品ID
					   Double price = agentOrder.getOrderPrice()*100;
					   int payMoney = Integer.parseInt(price.toString().split("\\.")[0]); 
					   packageParams.put("total_fee",payMoney);//价格 自定义
					   packageParams.put("notify_url", "http://nh.yunbiaowulian.com/api/pay/buy.html");//支付返回地址要外网访问的到, localhost不行,调用下面buy方法。(订单存入数据库)
					   packageParams.put("trade_type", "JSAPI");//这个api有,固定的
					   packageParams.put("openid", changeOpenId);//用户的openid 可以要 可以不要
					   //获取sign
					   String sign = PayCommonUtil.createSign("UTF-8", packageParams, ConstantURL.getPublicKey());//最后这个是自己在微信商户设置的32位密钥
					   packageParams.put("sign", sign);
//					System.out.println(sign);
					   //转成XML
					   String requestXML = PayCommonUtil.getRequestXml(packageParams);
//					System.out.println(requestXML);
					   //得到含有prepay_id的XML
					   String resXml = HttpUtil.postData("https://api.mch.weixin.qq.com/pay/unifiedorder", requestXML);
//					System.out.println(resXml);
					   //解析XML存入Map
					   Map map = XMLUtil.doXMLParse(resXml);
//					System.out.println(map);
					   //String return_code = (String) map.get("return_code");
					   //得到prepay_id
					   String prepay_id = (String) map.get("prepay_id");
					   SortedMap<Object, Object> packageP = new TreeMap<Object, Object>();
					   packageP.put("appId", ConstantURL.getApp_Id());//!!!注意,这里是appId,上面是appid
					   packageP.put("nonceStr", times);//时间戳
					   packageP.put("package", "prepay_id=" + prepay_id);//必须把package写成 "prepay_id="+prepay_id这种形式
					   packageP.put("signType", "MD5");//paySign加密
					   packageP.put("timeStamp", (System.currentTimeMillis() / 1000) + "");
					   //得到paySign
					   String paySign = PayCommonUtil.createSign("UTF-8", packageP, ConstantURL.getPublicKey());
					   packageP.put("paySign", paySign);
					   status=1;
					   resultJson.put("msg", "设置支付参数成功");
					   resultJson.put("orderId", agentOrder.getId());
					   //将packageP数据返回给小程序
					   JSONObject jsonObject1=JSONObject.fromObject(packageP);
					   resultJson.put("data", jsonObject1);
					   status=1;
					   resultJson.put("changeOpenId", changeOpenId);
					   resultJson.put("msg", "提交订单成功");
				   }else{
					   status=3;
					   resultJson.put("changeOpenId", changeOpenId);
					   resultJson.put("msg", "参数错误");
				   } 
			   }
		   }else{
			   status=2;
			   resultJson.put("changeOpenId", changeOpenId);
			   resultJson.put("msg", "提交订单失败");
		   }
		   
		   resultJson.put("status", status);
		   return resultJson;
	}
	
	
	
	//订单存入数据库  上面参数 packageParams.put("notify_url", "http://你的IP地址/order/buy.action");回调的就是这个方法
	@ResponseBody
	@RequestMapping(value="buy")
	public void Buy(HttpServletRequest request,HttpServletResponse response,AgentOrder agentOrder,String itemInfo,String changeOpenId,String type) throws Exception{
        System.out.println("--------------");
		BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream()));  
		String line = null;  
		StringBuilder sb = new StringBuilder();  
		while((line = br.readLine()) != null){  
			sb.append(line);  
		}  
		br.close();  
		//sb为微信返回的xml  
		String notityXml = sb.toString();
		System.out.println("notityXml"+notityXml);
		String resXml = "";  
		Map map = XMLUtil.doXMLParse(notityXml);
		String returnCode = (String) map.get("return_code");  
		if("SUCCESS".equals(returnCode)){
			String out_trade_no=(String) map.get("out_trade_no");
			agentOrderService.updateStatusByOrderSize(out_trade_no);
			resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"  
					+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> "; 
		}else {
			resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"  
					+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";  
		}
		BufferedOutputStream out = new BufferedOutputStream(  
				response.getOutputStream());  
		out.write(resXml.getBytes());  
		out.flush();  
		out.close();  
 
	}

	
	/**订单修改收款状态
	 * @param request
	 * @param id
	 * @throws Exception
	 */
	@ResponseBody
	@RequestMapping(value="upstatus")
	public void upstatus(HttpServletRequest request,String id) throws Exception{
		AgentOrder order = agentOrderService.getById(id);
		if(order!=null){
//			修改支付状态
			order.setPayStatus(2);
			Integer update = agentOrderService.update(order);
			if(update==1){
				//根据订单获取订单详情
				AgentOrderItem agentOrderItem = new AgentOrderItem();
				agentOrderItem.setOrderId(order.getId());
				List<AgentOrderItem> agentOrderItems = agentOrderItemService.getByOrderId(agentOrderItem);
				//修改后台商品库存
				for (AgentOrderItem agentOrderItem2 : agentOrderItems) {
					ItemTypePrice itemTypePrice=itemTypePriceService.getById(agentOrderItem2.getItempricetypeId()+"");
					if(itemTypePrice!=null){
						itemTypePrice.setId(itemTypePrice.getId());
						itemTypePrice.setNum(agentOrderItem2.getNum());
						itemTypePriceService.updateCountByItemTypeId(itemTypePrice);
					}
				}
			}
		}
	}
}

支付工具类1

package com.yunbiao.util.routine;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;

import com.yunbiao.util.common.character.Md5Tool;

public class PayCommonUtil {
	/** 
	 * 是否签名正确,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。 
	 * @return boolean 
	 */  
	public static boolean isTenpaySign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  
		StringBuffer sb = new StringBuffer();  
		Set es = packageParams.entrySet();  
		Iterator it = es.iterator();  
		while(it.hasNext()) {  
			Map.Entry entry = (Map.Entry)it.next();  
			String k = (String)entry.getKey();  
			String v = (String)entry.getValue();  
			if(!"sign".equals(k) && null != v && !"".equals(v)) {  
				sb.append(k + "=" + v + "&");  
			}  
		}  
 
		sb.append("key=" + API_KEY);  
 
		//算出摘要  
		String mysign = MD5.MD5Encode(sb.toString(), characterEncoding).toLowerCase();  
		String tenpaySign = ((String)packageParams.get("sign")).toLowerCase();  
 
		//System.out.println(tenpaySign + "    " + mysign);  
		return tenpaySign.equals(mysign);  
	}  
 
	/** 
	 * @author 
	 * @Description:sign签名 
	 * @param characterEncoding 
	 *            编码格式 
	 * @param parameters 
	 *            请求参数 
	 * @return 
	 */  
	public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) {  
		StringBuffer sb = new StringBuffer();  
		Set es = packageParams.entrySet();  
		Iterator it = es.iterator();  
		while (it.hasNext()) {  
			Map.Entry entry = (Map.Entry) it.next();  
			String k = entry.getKey().toString();  
			String v = entry.getValue().toString();  
			if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {  
				sb.append(k + "=" + v + "&");  
			}  
		}  
		sb.append("key=" + API_KEY);  
//		String sign = MD5.MD5Encode(sb.toString(), characterEncoding).toUpperCase();  
		String sign = Md5Tool.getMD5Digest(sb.toString()).toUpperCase();
		return sign;  
	}  
	public static String createLinkString(Map<String, String> params) {     
		List<String> keys = new ArrayList<String>(params.keySet());     
		Collections.sort(keys);     
		String prestr = "";     
		for (int i = 0; i < keys.size(); i++) {     
			String key = keys.get(i);     
			String value = params.get(key);     
			if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符     
				prestr = prestr + key + "=" + value;     
			} else {     
				prestr = prestr + key + "=" + value + "&";     
			}     
		}     
		return prestr;     
	}     
	/** 
	 * @author 
	 * @Description:将请求参数转换为xml格式的string 
	 * @param parameters 
	 *            请求参数 
	 * @return 
	 */  
	public static String getRequestXml(SortedMap<Object, Object> parameters) {  
		StringBuffer sb = new StringBuffer();  
		sb.append("<xml>");  
		Set es = parameters.entrySet();  
		Iterator it = es.iterator();  
		while (it.hasNext()) {  
			Map.Entry entry = (Map.Entry) it.next();  
			String k = entry.getKey().toString();  
			String v = entry.getValue().toString();   
			if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) {  
				sb.append("<" + k + ">"  + v + "</" + k + ">");  
			} else {  
				sb.append("<" + k + ">" + v + "</" + k + ">");  
			}  
		}  
		sb.append("</xml>");  
		return sb.toString();  
	}  
 
	/** 
	 * 取出一个指定长度大小的随机正整数. 
	 *  
	 * @param length 
	 *            int 设定所取出随机数的长度。length小于11 
	 * @return int 返回生成的随机数。 
	 */  
	public static int buildRandom(int length) {  
		int num = 1;  
		double random = Math.random();  
		if (random < 0.1) {  
			random = random + 0.1;  
		}  
		for (int i = 0; i < length; i++) {  
			num = num * 10;  
		}  
		return (int) ((random * num));  
	}  
 
	/** 
	 * 获取当前时间 yyyyMMddHHmmss 
	 *  
	 * @return String 
	 */  
	public static String getCurrTime() {  
		Date now = new Date();  
		SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");  
		String s = outFormat.format(now);  
		return s;  
	}
 
	public static boolean verify(String text, String sign, String key, String input_charset) {
		text = text + key;     
		String mysign =MD5.MD5Encode(text, input_charset).toUpperCase();  
		System.out.println(mysign);	System.out.println(mysign);	System.out.println(mysign);	System.out.println(mysign);
		if (mysign.equals(sign)) {     
			return true;     
		} else {     
			return false;     
		}     
	}  

}

支付工具类2

package com.yunbiao.util.routine;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

public class HttpUtil {
	private final static int CONNECT_TIMEOUT = 5000; // in milliseconds  
    private final static String DEFAULT_ENCODING = "UTF-8";  

    public static String postData(String urlStr, String data){  
        return postData(urlStr, data, null);  
    }  

    public static String postData(String urlStr, String data, String contentType){  
        BufferedReader reader = null;  
        try {  
            URL url = new URL(urlStr);  
            URLConnection conn = url.openConnection();  
            conn.setDoOutput(true);  
            conn.setConnectTimeout(CONNECT_TIMEOUT);  
            conn.setReadTimeout(CONNECT_TIMEOUT);  
            if(contentType != null)  
                conn.setRequestProperty("content-type", contentType);  
            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);  
            if(data == null)  
                data = "";  
            writer.write(data);   
            writer.flush();  
            writer.close();    

            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));  
            StringBuilder sb = new StringBuilder();  
            String line = null;  
            while ((line = reader.readLine()) != null) {  
                sb.append(line);  
                sb.append("\r\n");  
            }  
            return sb.toString();  
        } catch (IOException e) {  
            //logger.error("Error connecting to " + urlStr + ": " + e.getMessage());  
        } finally {  
            try {  
                if (reader != null)  
                    reader.close();  
            } catch (IOException e) {  
            }  
        }  
        return null;  
    }  



}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值