微信H5支付及通知回调

这篇具有很好参考价值的文章主要介绍了微信H5支付及通知回调。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. H5支付配置

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

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

登录并配置,在商户平台上 - 产品中心 - 开通相关的产品,比如我这里使用的是 H5支付文章来源地址https://www.toymoban.com/news/detail-531071.html

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;
}

到了这里,关于微信H5支付及通知回调的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue实现H5支付(微信,支付宝)

    1.判断浏览器是微信还是支付宝或其他浏览器 2.微信浏览器调用微信支付的方法(调用后台接口创建订单,需要微信用户唯一标识openid;接口返回微信支付所需的支付参数) 3.支付宝浏览器支付方法

    2024年02月16日
    浏览(32)
  • 前端H5微信支付宝支付实现

    支付宝的 首先是一个支付类型选择页面,在选择支付宝支付后,跳转到一个空白页,用于支付宝支付的中转页面。 在点击立即支付之后,直接跳转至自行设置好的空白页就好,并把你生成订单所需要的数据一并带过去。 接下来就是重点操作了(其实非常简单),在跳转这个

    2024年02月03日
    浏览(38)
  • 微信的 h5 支付和 jsapi 支付

    申请地址: https://pay.weixin.qq.com/ 如果你还没有微信商户号,请点击上面的链接进行申请,如果已经有了,可以跳过这一步 首先点击 账户中心 ▶ API安全 ▶ 申请API证书 申请详细步骤: https://kf.qq.com/faq/161222NneAJf161222U7fARv.html 首先点击 账户中心 ▶ API安全 ▶ 设置APIv3密钥 ▶

    2024年02月13日
    浏览(31)
  • 〔支付接入〕微信的 h5 支付和 jsapi 支付

    申请地址: https://pay.weixin.qq.com/ 如果你还没有微信商户号,请点击上面的链接进行申请,如果已经有了,可以跳过这一步 首先点击 账户中心 ▶ API安全 ▶ 申请API证书 申请详细步骤: https://kf.qq.com/faq/161222NneAJf161222U7fARv.html 首先点击 账户中心 ▶ API安全 ▶ 设置APIv3密钥 ▶

    2024年02月13日
    浏览(36)
  • 微信仿H5支付

    仿H5支付是指一种模拟原生H5支付流程的非官方支付方式。这种支付方式通常是由第三方支付服务提供商开发和维护的,目的是为了绕过官方支付渠道的限制,如费率、审核等问题。然而,由于仿H5支付并非官方授权和认可的支付方式,其安全性和合规性可能存在隐患。 使用仿

    2024年02月10日
    浏览(27)
  • 微信 h5 支付开发

    申请地址: https://pay.weixin.qq.com/ 如果你还没有微信商户号,请点击上面的链接进行申请,如果已经有了,可以跳过这一步 首先点击 账户中心 ▶ API安全 ▶ 申请API证书 申请详细步骤: https://kf.qq.com/faq/161222NneAJf161222U7fARv.html 首先点击 账户中心 ▶ API安全 ▶ 设置APIv3密钥 ▶

    2024年02月14日
    浏览(20)
  • 微信H5页面实现微信小程序支付

    背景: 在微信H5页面已经实现了微信JSAPI的网页支付,老板要求把整个业务线快速转移到微信小程序中,作为懒惰的程序员来说,直接把页面嵌套到小程序不就行了。说干就干,在小程序中设置好基本信息后,一预览居然成功了,一切看来是那么顺利,可到了系统的支付环节

    2024年02月14日
    浏览(39)
  • 前端实现微信支付(H5,微信小程序)

    通常一些电商项目使用到微信支付操作,所以简单地介绍一下微信支付的具体流程。 微信支付是微信内置微信浏览器(其他浏览器不支持)或者微信小程序的支付接口,主要负责用户对商家执行支付操作的流程。 例如常见的电商在下单环节,就需要通过使用微信支付接口,

    2024年02月08日
    浏览(46)
  • uniapp前端支付篇(微信、抖音、快手、h5)四个平台支付

    微信、快手、h5支付步骤大致相同,只有抖音是有自己的支付组件 项目同时支持多个(微信、快手、h5)平台支付,后端那边代码可以封装的 点击支付 创建订单 生成密钥和支付所需要的参数 支付成功 查询订单状态 1.支付按钮 2.支付事件 1.支付按钮 2.支付事件 抖音有自己的

    2024年02月02日
    浏览(38)
  • app内嵌h5支付功能,跳转支付宝&微信,vue组件

    app内前h5涉及到支付的功能,ios非实物商品实付需要使用ios原生支付方式,实物商品则可以三方支付,主要的实现思路为后端返回跳转支付宝或微信的支付scheme链接,前端进行跳转支付,同时需要实时查询用户的支付状态。 整个过程中复杂的部分在于查询用户支付状态的体验

    2024年02月06日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包