微信移动端网站H5支付

接入主体: 企业或个人
场景: 手机网站支付是指商家在移动端网页展示商品或服务,用户在商家页面确认使用微信支付后,手机浏览器唤起手机微信收银台。

一、业务流程

请求地址:

https://kf.fw199.com/gateway/partner/pay/wx/personal/h5

二、请求地址:

参数名 类型 说明 示例
appid String 合作伙伴Id
timestamp String 时间戳 请求时的时间,unixtime格式
mch_id String 商户ID 向蜂巢客服咨询获取
ext_trade_no String 开发者传入的订单 , 比如1586420573605 不可传入重复的订单号,此订单号在付款完成后,推送回调时一同返回,开发者可以根据此订单号进行业务逻辑处理。
amount int 付款金额,单位分 比如 350, 表示3.5 元。
attach String 附加参数,200字以内 支付完成回调时原样返回给开发者。
body String 商品说明
notify_url String 支付完成后的异步回调通知Url 比如, http(s)://yoururl.com/paynotify ,确保公网可访问
redirect_url String 支付完成后的页面重定向(跳转)Url 比如, http(s)://yoururl.com/xxxxxx ,确保公网可访问
sign String 签名 对各参数使用提供的AppSecret进行签名,签名逻辑具体实现见示例代码

请求示例

  @Test  
    public void PayWXCreateH5Pay() throws Exception {  
        //支付金额 (单位分)  
        String  amount ="1000";  
        String  mchId  ="163588 "; //由蜂巢提供的微信商户号,向客服咨询
        // 确保传入的开发者订单号唯一, 订单号生成规则开发者可自定,  修改  
        String ext_trade_no =String.valueOf(System.currentTimeMillis());  
        // 扩展参数,付款成功时回调给开发者时会原样返回,根据自己需求填写或为空。  
        String attach ="";  
        // 订单标题  
        String body ="支付测试商品08";  
        // 回调通知url,开发者自己的服务器Url  
        String notify_url = Config.PayNotifyUrl;  
        //业务参数  
        Map<String, String> data = new HashMap<String, String>();  
        data.put("appid",  Config.AppId);  
        Long timestamp = System.currentTimeMillis() / 1000;  
        data.put("timestamp", timestamp.toString());  
        data.put("ext_trade_no",ext_trade_no );  
        data.put("mch_id",mchId );  
        data.put("amount",amount );  
        data.put("attach",attach );  
        data.put("body" , body );  
        data.put("notify_url",notify_url );
    // data.put("redirect_url","https://www.163.com" );
        data.put("sign", Utils.Sign(data, Config.AppSecret   ));  
        String result = doHttpRequest(Config.PayWXPersonalCreateH5PayUrl,data);  
       System.out.println("result:"+result);  
       JSONObject rsp = JSON.parseObject(result);  
       if (rsp.getInteger("code") == 0){  
           JSONObject rspData = rsp.getJSONObject("data");  
           String payUrl = URLDecoder.decode(rspData.getString("h5pay_url"),"utf-8");  
           System.out.println("请在手机浏览器点击此Url跳去支付:"+payUrl);  
       } else {  
           System.out.println("返回错误:" + rsp.getString("message"));  
       }   
    }

三、接口返回结果:

{
  "code": 0,
  "message": "ok",
  "data": {
    "h5pay_url": "https%3A%2F%2Fkf.fw199.com%2Fgateway%2Fpartner%2Fpay%2Fwx%2Fpersonal%2Fh5payshow%3Ffc_trade_no%3D20230813001105023839%26ts%3D1691856665%26sign%3D07C7DEF82E4FF5ACDA917467327D5DB8%26pid%3D11"
  },
  "trace_id": ""
}

返回参数说明

参数名 类型 说明 示例
code int 0时为成功,非0为失败
message String 消息 code非0时,会包含错误的出错信息
h5pay_url String 返回的h5付款链接,需要url decode解码 成功才有h5pay_url 值

开发者获取到h5的支付链接h5pay_url后, 在自己的移动手机端网站供用户点击唤起手机微信收银台。 用户付款后,蜂巢将会推送付款通知,如何处理付款回调通知,请见支付回调通知

四、参考示例

下面给出商家H5网站的调用示例,前端交互方式仅为参考,您可以根据自己网站的情况进行调整。

4.1 商家H5网站前端

此网页为终端用户浏览访问的下单页面, 在此页面调用商家自己的后台API。

<script> 

    let amount = '10'; 

    function goWxPay() {
         // 商家自己
        var url = 'https://YOU-SYSTEM-API/wxpay/h5pay';
        fetch(url, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
            },
            body: `amount=${amount}`
        })
            .then((response) => response.json())
            .then((rsp) => {
                if (rsp.code == 0) {
                    window.open(rsp.h5pay_url);
                } else {
                    alert(rsp.msg);
                }
            });
    }
</script>


<section>
    <h1>蜂巢H5支付演示</h1> 
    <h2>
        付款金额(元): <input bind:value="{amount}" type="text" /> 
    </h2>
    <h3>
        <button on:click={goAlipay}>支付宝付款</button>  
        <button on:click={goWxPay}>微信付款</button>
    </h3>
</section>

H5网站用户下单的主要代码示例。

4.2 商家H5网站后台API

下面代码为4.1的网站提供API接口服务,用于处理前端界面传入的金额,保存订单等,再向蜂巢发起支付请求,以获取微信的支付url并返回给h5网站。

  @RequestMapping("/wxpay/h5pay")
    @CrossOrigin
    @ResponseBody
    public Map wxH5Pay(HttpServletRequest request, HttpServletResponse response) {

        Map<String, Object> map = new HashMap<String, Object>();
        //返回结果,statusCode =0 表示已收到推送的数据
        map.put("code", 0);
        map.put("msg", "成功");
        String amount = request.getParameter("amount");
        // 支付金额如果前端传入是元,则要转为 (单位分)
        Long amountFen = Long.valueOf(amount) * 100;
        try {
            String mchId = "1635xxxx"; //由蜂巢提供的支付宝商户号, 联系蜂巢客服
            // 确保传入的开发者订单号唯一, 订单号生成规则开发者可自定,  修改
            String ext_trade_no = String.valueOf(System.currentTimeMillis());
            // 扩展参数,付款成功时回调给开发者时会原样返回,根据自己需求填写或为空。
            String attach = "none";
            // 订单标题
            String body = "支付测试商品0806-4";
            // 回调通知url,开发者自己的服务器Url
            String notify_url = Config.PayNotifyUrl;
            //业务参数
            Map<String, String> data = new HashMap<String, String>();
            data.put("appid", Config.AppId);
            Long timestamp = System.currentTimeMillis() / 1000;
            data.put("timestamp", timestamp.toString());
            data.put("ext_trade_no", ext_trade_no);
            data.put("mch_id", mchId);
            data.put("amount", amountFen.toString());
            data.put("attach", attach);
            data.put("body", body);
            data.put("notify_url", notify_url);
            data.put("sign", Utils.Sign(data, Config.AppSecret));
            String result = Utils.doHttpRequest(Config.PayWXPersonalCreateH5PayUrl, data);
            JSONObject rsp = JSON.parseObject(result);
            if (rsp.getInteger("code") == 0) {
                JSONObject rspData = rsp.getJSONObject("data");
                String payUrl = URLDecoder.decode(rspData.getString("h5pay_url"), "utf-8");
                map.put("h5pay_url", payUrl);
                return map;
            }
            map.put("code", 1);
            map.put("msg", "请求支付失败:" + rsp.getString("message"));
            return map; 

        } catch (Exception ex) {
            ex.printStackTrace();
            //日志处理
            map.put("code", 1);
            map.put("msg", "请求支付失败:" + ex.getMessage());
            return map;
        }

    }

4.3 商家H5网站支付效果

用户选择微信支付 , 唤起微信收银台,如下图:

文档更新时间: 2024-08-11 21:17   作者:admin