微信H5支付及通知回调

一. H5支付配置

1.在微信商户平台中进行登录并申请相关功能和配置

1.1微信商户平台https://pay.weixin.qq.com/index.php/core/home/loginreturn_url=%2F

登录并配置,在商户平台上 - 产品中心 - 开通相关的产品,比如我这里使用的是 H5支付

1.2 然后配置相关的参数
//APPID
//mchid(商户号)
//API key(V3的密钥)
//privateKey(商户私钥)
//mchSerialNo (证书序列号)
//以上参数的配置说明可以参考微信文档  https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_6_1.shtml

二.开发

2.1导入相关依赖
<dependency>
	<groupId>com.github.wechatpay-apiv3</groupId>
	<artifactId>wechatpay-apache-httpclient</artifactId>
	<version>0.2.2</version>
</dependency>	
2.2 代码编写
//此方法为微信的H5支付
//cashNum      微信支付的金额单位是 分,如果使用的元,在这里需要转换。
//orderNo      商户的订单号,在同一个商户号下必须是唯一的。
//redirect_url 支付成功后的跳转地址。
public ReturnJson weChatPay_H5(int cashNum, String orderNo,String redirect_url) throws Exception {
    //1.私钥为String字符串的方式来加载
    //PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(WX_KEY.getBytes("utf-8")));
    //2.通过加载文件的方式来读取私钥
    String path = this.getClass().getClassLoader().getResources("./apiclient_key.pem").nextElement().getPath();
    //加载商户私钥(私钥存储在文件)
    PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new FileInputStream(path));
    //加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
    AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(new WechatPay2Credentials(WX_MCH_ID, new PrivateKeySigner(WX_Serial_Number, merchantPrivateKey)),V3_key.getBytes("utf-8"));
    //初始化httpClient
    CloseableHttpClient builder = WechatPayHttpClientBuilder.create().withMerchant(WX_MCH_ID, WX_Serial_Number, merchantPrivateKey).withValidator(new WechatPay2Validator(verifier)).build();
    //请求的微信支付地址
    HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/h5");
    //发送给微信的部分json参数
    //amount 为订单的金额信息
    //total  为订单总金额(单位:分)
    //currency 货币类型
    //scene_info 支付的场景相关信息
    //payer_client_ip  用户的终端ip,支持IPV4和IPV6
    //h5_info  h5支付的场景信息
    //type  支付场景类型
    //mch_id	商户号
    //description  商品描述
    //notify_url  回调通知地址(此地址是用户支付成功后,微信方要发送支付成功的通知)
    //out_trade_no  商户订单号
    //goods_tag		商品标签
    //appid			appid
    String reqData = "{"
            + "\"amount\": {"
            + "\"total\": "+cashNum+","
            + "\"currency\": \"CNY\""
            + "},"
            + "\"scene_info\": {"
            + "\"payer_client_ip\":\"14.23.150.200\","
            + "\"h5_info\": {"
            + "\"type\": \"Wap\"" + "}},"
            + "\"mchid\": \""+WX_MCH_ID+"\","
            + "\"description\": \"优选商城\","
            + "\"notify_url\": \""+AliPay_H5_NotifyUrl+"\","
            + "\"out_trade_no\": \""+orderNo+"\","
            + "\"goods_tag\": \"WXG\","
            + "\"appid\": \""+WX_APP_ID+"\"" + "}";
    StringEntity entity = new StringEntity(reqData,"utf-8");
    entity.setContentType("application/json");
    httpPost.setEntity(entity);
    httpPost.setHeader("Accept","application/json");
    CloseableHttpResponse response = builder.execute(httpPost);
    try {
        int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode == 200) {
            String url = URLEncoder.encode(redirect_url, "GBK");
            JSONObject js = JSONObject.parseObject(EntityUtils.toString(response.getEntity()));
            String  aa = js.get("h5_url").toString();
            js.put("h5_url",aa+"&redirect_url="+url);
            String payUrl = js.toJSONString();
            return ReturnUtils.returnVal(CommonConstants.appCode.SUCCESS.get(),payUrl);
        } else if (statusCode == 204) {
            return ReturnUtils.returnVal(CommonConstants.appCode.SUCCESS.get(), EntityUtils.toString(response.getEntity()));
        } else {
            return ReturnUtils.returnVal(CommonConstants.appCode.DATAERROR.get(), EntityUtils.toString(response.getEntity()));
        }
    } finally {
        response.close();
    }
}
2.3 编写H5支付回调接口
	//用户支付成功后,通知的回调地址
	//进行两步操作 1.接收微信发送的参数后,验签并解析。
	//2.根据微信给到的参数,出发后续的操作,比如修改订单状态、发送站内信等等
	//此接口微信可能会出现多次调用,请注意处理
	@ResponseBody
    @RequestMapping(value = "/wechatRefundNotify",produces = {"application/json;charset=utf-8"})
    public ResultEntity wechatRefundNotify(@RequestBody WeChatPayEntity weChatPayEntity) {
        AesUtil aesUtils = new AesUtil(this.V3_key.getBytes());
        try {
            String string = aesUtils.decryptToString(weChatPayEntity.getResource().getAssociated_data().getBytes(), weChatPayEntity.getResource().getNonce().getBytes(), weChatPayEntity.getResource().getCiphertext());
            JSONObject jsonObject = JSONObject.parseObject(string);
            //获取订单号
            String out_trade_no = jsonObject.getString("out_trade_no");
            //获取支付的订单状态, SUCCESS(支付成功)
            String trade_state = jsonObject.getString("trade_state");
            //获取支付状态  SUCCESS
            if(refund_status.equals("SUCCESS")){
                //进行支付成功后的相关操作.....
                //然后返回给微信指定的参数,否则微信可能会再次通知
                return new ResultEntity("SUCCESS", "成功");
            }else {
                //这里是支付状态错误.....
                //进行相关的操作
                return new ResultEntity("FAIL", "失败");
            }
        } catch (Exception e) {
            //错误处理
        }
        return new ResultEntity("FAIL", "失败");
    }
2.4 微信回调接收的相关参数实体类
	//WeChatPayEntity 类
	public class WeChatPayEntity {
	//通知创建时间
    private String create_time;
    //回调摘要
    private String summary;
    //通知数据类型
    private String resiyrce_type;
    //通知的资源数据(支付订单的相关信息)
	private WeChatRequestEntities resource = new WeChatRequestEntities();
	
	}
//WeChatRequestEntities 类
public class WeChatRequestEntities {
	//微信返回交易状态
	//SUCCESS:支付成功
	//REFUND:转入退款
	//NOTPAY:未支付
	//CLOSED:已关闭
	//REVOKED:已撤销(付款码支付)
	//USERPAYING:用户支付中(付款码支付)
	//PAYERROR:支付失败(其他原因,如银行返回失败)
    private String trade_state;
	//商户订单号(我们对接H5支付接口时候传入的 订单号)
    private String out_trade_no;
	//附加数据
    private String associated_data;
	//随机串
    private String nonce;
	//数据密文
    private String ciphertext;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值