生成订单及支付
@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;
}
}