目前有什么问题,主要是接口问题还是微信小程序有问题
现有wx小程序支付模块支付失败,现象之一是prepay =null。解决问题标准:调通现有支付模块,正确完成支付
alabiety我的号
//问题之一:prepay_id 为空
appId: "wxeb1c606443b90932"
nonceStr: "SDf6FJRiJVW6JDtv"
package: "prepay_id=null"
paySign: "F541E728E24F9C8CEA288B6A22CA982A"
signType: "MD5"
timeStamp: "1657029359"
以上是前端表现的结果
前端调用pay()的参数如下
payment ={
contributed: "0.01"
departname: 230
endtime: "2022-10"
groupname: 2251
lockedorg: 0
notes: "test"
openid: "oHrE75DhUkimOsJRGgMygq_HA3Ok"
orgid: 41
page: "12"
payable: "821776.24"
periodid: "72"
starttime: "2022-10"
}
用以上参数调用pay()
@Transactional
public Map<String, Object> pay(Payment payment) {
Map<String, Object> resultMap = new HashMap<String, Object>();
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Orgroup orgroup = new Orgroup();
orgroup.setGroupid(Integer.parseInt( payment.getGroupname()));
orgroup=orgroupMapper.selectByPrimaryKey(orgroup);
Orgdept orgdept = new Orgdept();
orgdept.setDepartmentid(Integer.parseInt( payment.getDepartname()));
orgdept=orgdeptMapper.selectByPrimaryKey(orgdept);
Double orderMoney = payment.getContributed();
System.out.println("微信支付接口,支付金额为:" + orderMoney);//+ orderMoney);
String money = String.valueOf(orderMoney* 100);
int i = money.indexOf(".");
System.out.println(money+"int i = money.indexOf" + String.valueOf(i));//+ orderMoney);
if (i > 0) {
money = money.substring(0, i);
System.out.println(money+"money = money.substring(0, i)" + String.valueOf(i));//+ orderMoney);
}
String orderNo = CommentUtil.getOrderNo();
String nonce_str = PayCommonUtil.CreateNoncestr();
SortedMap<Object, Object> parameters = new TreeMap<Object, Object>();
parameters.put("appid", ConfigUtil.APPID);
parameters.put("mch_id", ConfigUtil.MCH_ID);
parameters.put("openid", payment.getOpenid());
//parameters.put("openid", "ogbsq40nuX08RQtNA4Gxkt1bVpgQ");
parameters.put("nonce_str", nonce_str);
parameters.put("body","微信支付");
parameters.put("out_trade_no", orderNo); // 订单号
parameters.put("fee_type", "CNY");
parameters.put("total_fee", money);
parameters.put("spbill_create_ip", "127.0.0.1");//上线使用
parameters.put("notify_url", ConfigUtil.NOTIFY_URL);
parameters.put("trade_type", "JSAPI");
parameters.put("sign_type", "MD5");
// 设置签名
String sign = PayCommonUtil.createSign("UTF-8", parameters);
parameters.put("sign", sign);
// 封装请求参数结束
String requestXML = PayCommonUtil.getRequestXml(parameters);
// 调用统一下单接口
String result = PayCommonUtil.httpsRequest(ConfigUtil.UNIFIED_ORDER_URL, "POST", requestXML);
/**
* 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,
* partnerId
* ,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
**/
Map<String, String> map = XMLUtil.doXMLParse(result);
SortedMap<Object, Object> parameterMap2 = new TreeMap<Object, Object>();
parameterMap2.put("appId", ConfigUtil.APPID);
parameterMap2.put("timeStamp", String.valueOf(System.currentTimeMillis()).toString().substring(0, 10));
parameterMap2.put("nonceStr", nonce_str);
parameterMap2.put("package", "prepay_id=" + map.get("prepay_id"));
parameterMap2.put("signType", "MD5");
String sign2 = PayCommonUtil.createSign("UTF-8", parameterMap2);
parameterMap2.put("paySign", sign2);
resultMap.put("code", "200");
resultMap.put("msg", parameterMap2);
//生成订单
// SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
Payment p = new Payment();
p.setOpenid(payment.getOpenid());
p.setOrderno(orderNo);//订单号
p.setStatus("0");//未支付
p.setPstartdate(sdf.parse(payment.getStarttime()));//期档开始时间
p.setPenddate(sdf.parse(payment.getEndtime()));//期档结束时间
p.setPaytime(new Date());
p.setPeriodid(payment.getPeriodid());//期档id
p.setContributed(payment.getContributed());//实缴金额
p.setPayable(payment.getPayable());//应缴金额
p.setRefund(CommentUtil.sub(payment.getContributed(),payment.getPayable()));//补缴(应缴减去实缴)
p.setDepartname(orgdept.getDepartname());//edptname
p.setGroupname(orgroup.getGname());//groupname
if (payment.getNotes()!=null ){
p.setNotes(payment.getNotes());}//notes
if (payment.getNotesgrp()!=null) {
p.setNotesgrp(payment.getNotesgrp());}//小组备注
p.setOrgid(payment.getOrgid()); //(payment.getNotes());// p.setGroupname(orgroup.getGname());//小组名称
if (payment.getPage() ==3 ) {
p.setLockedgrp("1");
p.setLockedorg(payment.getLockedorg());//1:线下
}
paymentMapper.insertSelective(p);
System.out.println("p="+p);
resultMap.put("rid", p.getRid());//判断是否支付成功时用
System.out.println("微信支付判断是否支付成功时用: resultMap.put==-rid-, p.getRid()" + resultMap);//+ orderMoney);
return resultMap;
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
}
看你请求参数是二维码支付(只有二维码支付有参数:nonce_str)
二维码文档:
订单编号是不是重复
你这个是用的老的微信支付版本吧? 可以用新版(v3)的那个试试,我们项目前段时间也引入了微信支付,用的native(/v3/pay/transactions/native)的那个二维码支付。
附上当时给组里写的一个Demo。
试着支付了好几个一分钱,可以正常支付。就是最后钱忘记退回来了……
推荐你使用 https://javen205.gitee.io/ijpay/guide/
给你一个 我当时接入APP支付demo 流程都是一样的 改一下里面的支付枚举类型就好!!!
```java
@Transactional(rollbackFor = Exception.class)
public Map<String, String> tradeCreate(WxPayParam wxPayParam) {
try {
HttpServletRequest request = HttpServletUtil.getRequest();
//将下单信息交易转换model
PayTradeHistory payTradeHistory = new PayTradeHistory();
//生成商家订单号
String orderId = WxPayKit.generateStr();
//保存交易记录
payTradeHistory.setOutTradeNo(orderId);
payTradeHistory.setBillDate(DateTime.now());
payTradeHistory.setAmount(wxPayParam.getAmount());
if (StrUtil.isEmpty(wxPayParam.getBody())) {
payTradeHistory.setBody(PayGoodsConstant.APP_PAY_GOODS_SUBJECT);
} else {
payTradeHistory.setBody(wxPayParam.getBody());
}
if (StrUtil.isEmpty(wxPayParam.getAttach())) {
payTradeHistory.setSubject(PayGoodsConstant.APP_PAY_GOODS_SUBJECT);
} else {
payTradeHistory.setSubject(wxPayParam.getAttach());
}
payTradeHistory.setStatus(PayTradeHistoryStatusEnum.UN_PAY.getCode());
payTradeHistory.setPayType(PayTypeEnum.WX_PAY.getCode());
//获取ip地址
String ip = IpKit.getRealIp(request);
if (StrKit.isBlank(ip)) {
ip = "127.0.0.1";
}
//构建统一下单参数
WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
Map<String, String> params = UnifiedOrderModel
.builder()
.appid(wxPayApiConfig.getAppId())
.mch_id(wxPayApiConfig.getMchId())
.nonce_str(WxPayKit.generateStr())
.body(payTradeHistory.getBody())
.attach(payTradeHistory.getSubject())
.out_trade_no(orderId)
.total_fee(payTradeHistory.getAmount().toString())
.spbill_create_ip(ip)
.notify_url(wxPayApiConfig.getDomain().concat("/wxPay/payNotify"))
.trade_type(wxPayParam.getTradeType())
.build()
.createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
String xmlResult = WxPayApi.pushOrder(false, params);
log.info("微信支付下单返回:{}", xmlResult);
Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
String returnCode = result.get(WxPayConstant.RETURN_CODE);
if (!WxPayKit.codeIsOk(returnCode))
throw new ServiceException(WxPayExceptionEnum.TRADE_CREATE_ORDER_ERROR.getCode(), result.get(WxPayConstant.RETURN_MSG));
// 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
String prepayId = result.get(WxPayConstant.PREPAY_ID);
//payTradeHistory.setTradeNo(prepayId);
payTradeHistoryService.add(payTradeHistory);
return WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId,
wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
} catch (Exception e) {
log.error(">>> 微信支付异常:{}", e.getMessage());
throw new ServiceException(WxPayExceptionEnum.TRADE_CREATE_ORDER_ERROR.getCode(), e.getMessage());
}
}
public class PayTradeHistory {
/**
* 主键
*/
@TableId(type = IdType.ASSIGN_ID)
private Long id;
/**
* 商户系统内部的订单号
*/
private String outTradeNo;
/**
* 商家订单号
*/
private String tradeNo;
/**
* 交易日期
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date billDate;
/**
* 交易金额 单位 元
*/
private BigDecimal amount;
/**
* 商品名称
*/
private String subject;
/**
* 商品描述
*/
private String body;
/**
* 交易状态(字典 0未支付 1已支付 2已退款 3已关闭 4已关闭有退款)
*/
private Integer status;
/**
* 支付类型 1微信 2支付宝
*/
private String payType;
}
```