JAVA实现微信公众号支付

H5支付参考:https://blog.csdn.net/zhuwei_clark/article/details/108242556

对于公众号支付,需要注意细节:

    public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
        this.config = config;
        this.notifyUrl = notifyUrl;
        this.autoReport = autoReport;
        this.useSandbox = useSandbox;
        if (useSandbox) {
            this.signType = SignType.MD5; // 沙箱环境
        }
        else {
            this.signType = SignType.MD5;
        }
        this.wxPayRequest = new WXPayRequest(config);
    }

不然会出现签名不对的情况

至于Java集成公共号支付其实代码还是挺简单

 public Map<String,String> jsPay(H5OrderDto orderDto,String code) {
        String openId = openIdService.getOpenIdByCodeZZH(code,wxPay.getConfig().getAppID(),wxPay.getConfig().getAppSecret());
        //参数名称对应的参数值
        Map<String,String> valueMap = new HashMap();
        //公众号
        valueMap.put("appid", wxPay.getConfig().getAppID());
        //商户号
        valueMap.put("mch_id", wxPay.getConfig().getMchID());
        //设备信息
        valueMap.put("device_info", "WEB");
        //随机字符串
        valueMap.put("nonce_str", PayUtil.getRandom());
        //签名类型
        valueMap.put("sign_type", "MD5");
        //商品描述
        valueMap.put("body", orderDto.getBody());
        //订单号
        valueMap.put("out_trade_no", orderDto.getOrderId());
        //价格
        valueMap.put("total_fee",String.valueOf(orderDto.getPrice()));
        //终端IP
        valueMap.put("spbill_create_ip",orderDto.getIp());
        //回调地址
        valueMap.put("notify_url", orderDto.getCallBackUrl());
        //交易类型
        valueMap.put("trade_type", "JSAPI");//公众号支付
        //商品编号
        valueMap.put("product_id", orderDto.getProductId());//公众号支付
        //openID
        valueMap.put("openid", openId);
        //回传参数
        valueMap.put("attach", orderDto.getAttach());
        //获取请求报文
        Map<String, String> result = null;
        try {
            result = wxPay.unifiedOrder(valueMap);
        }catch (Exception e){
            e.printStackTrace();
            log.error("下单出错!");
            throw new PayException("下单失败");
        }
        if(result!=null&&WXPayConstants.SUCCESS.equals(result.get("return_code"))){
            Map<String,String> params =  getResult(result.get("prepay_id"));
            params.put("openId",openId);
            return params;
        }
        throw new PayException("下单失败");
    }

    /**
     * 前端返回结果处理
     * @param prepayId
     * @return
     */
    private Map<String,String> getResult(String prepayId){
        //参数名称对应的参数值
        Map<String,String> valueMap = new HashMap();
        //公众号
        valueMap.put("appId", wxPay.getConfig().getAppID());
        //时间戳
        valueMap.put("timeStamp", System.currentTimeMillis()/1000+"");
        //随机字符串
        valueMap.put("nonceStr", PayUtil.getRandom());
        //签名类型
        valueMap.put("signType", "MD5");
        //扩展字段
        valueMap.put("package", "prepay_id="+prepayId);
        //获取签名
        try {
            String paySign = WXPayUtil.generateSignature(valueMap, wxPay.getConfig().getKey(), WXPayConstants.SignType.MD5);
            valueMap.put("paySign", paySign);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return valueMap;
    }

基本上这样处理就完事了,然后就是前端代码,这个也相对于来说比较简单

//初始化支付方法
	function onBridgeReady(param){
	   WeixinJSBridge.invoke(
	       'getBrandWCPayRequest', {
	           "appId":param.appId,     //公众号名称,由商户传入     
	           "timeStamp":param.timeStamp,         //时间戳,自1970年以来的秒数     
	           "nonceStr":param.nonceStr, //随机串     
	           "package":param.package,     
	           "signType":param.signType,         //微信签名方式:     
	           "paySign":param.paySign //微信签名 
	       },
	       function(res){   
	           if(res.err_msg == "get_brand_wcpay_request:ok" ) {// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
		           	order_status(param.pkOrder);
	           }else{
	           		window.location.href = window.location.href;
	           }
	       }
	  ); 
	}

这里最重要的是注意参数名称和大小写的问题。

还是就是前端所有的参数都是后台返回的,不要前端自己缓存

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值