小程序微信支付开发调试,调通一个现有支付模块

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

目前有什么问题,主要是接口问题还是微信小程序有问题

现有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)
二维码文档:


其他支付类型文档:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_1.shtml

订单编号是不是重复

你这个是用的老的微信支付版本吧? 可以用新版(v3)的那个试试,我们项目前段时间也引入了微信支付,用的native(/v3/pay/transactions/native)的那个二维码支付。

附上当时给组里写的一个Demo。

img

试着支付了好几个一分钱,可以正常支付。就是最后钱忘记退回来了……

推荐你使用 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;

}
```