公众号微信支付直播室送礼物

1.h5页面通过这个接口获取预支付id

    @RequestMapping(value = "/payOrder")
    @ResponseBody
    public String payOrder(HttpServletRequest request, double totalFee, String body,String openId, String attach) throws Exception {
        String resultString = null;
        BigDecimal fee = new BigDecimal(totalFee); // 微信支付参数以分为单位。
        fee = fee.multiply(new BigDecimal(100));
        String payFee = fee.longValue() + "";
        //1 生成预支付id
        String ipAddress = request.getRemoteAddr();
        String orderNumber = System.currentTimeMillis() + new Random().nextInt(100) + "";
        String openid=String.valueOf(openId);
        logger.info("微信支付准备"+openid+attach+"");
        try {
            Map<String, String> map = PayCommonUtil.getPrepayId(payFee, ipAddress, orderNumber, body, openid,attach);
            String prepay_id = map.get("prepay_id");
            //2 给H5页面传递参数  调起微信支付
            resultString = PayCommonUtil.createPackageValue(prepay_id);

        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resultString;
    }

2.H5页面代码如下:通过预支付id调起公众号支付

$.post("/douyalive/chatroom/payOrder",{totalFee:totle,body:"送出礼物——"+body,openId:getUserInfo().openId,attach:attach},function(data){
            var _data=JSON.parse(data)
            function onBridgeReady(){
               WeixinJSBridge.invoke(
                   'getBrandWCPayRequest', {
                       "appId":_data.appId,     //公众号名称,由商户传入     
                       "timeStamp":_data.timeStamp,         //时间戳,自1970年以来的秒数     
                       "nonceStr":_data.nonceStr, //随机串     
                       "package":_data.package,     
                       "signType":_data.signType,         //微信签名方式:     
                       "paySign":_data.paySign //微信签名 
                   },
                   function(res){ 
                        if(res.err_msg == "get_brand_wcpay_request:ok" ) {
                        sessionStorage.setItem("type1",2)
                           ChatRoom.sendGiftI(); 
                           console.log(11)
                        }else if(res.err_msg == "get_brand_wcpay_request:cancel"){
                            alert("支付取消")
                        }else{
                            alert("支付失败")  
                        }     
                   }
               ); 
            }
            if (typeof WeixinJSBridge == "undefined"){
               if( document.addEventListener ){
                   document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
               }else if (document.attachEvent){
                   document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
                   document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
               }
            }else{
               onBridgeReady();
            }   
        }) 

附PayCommonUtil工具类的代码

public class PayCommonUtil {
    @SuppressWarnings("unused")
    private static Logger log = LoggerFactory.getLogger(PayCommonUtil.class);
    //微信支付统一接口(POST)
    public final static String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
    public final static String APPID = "";//服务号的应用号
    public final static String MCH_ID = "";//商户号
    public final static String APP_SECRECT  = "";
    public final static String  API_KEY = "";//API密钥
    public final static String SIGN_TYPE = "MD5";//签名加密方式
    //通知回调地址
    public final static String NOTIFY_URL = "http://wx.douyamovie.com/douyawechat/notice.do";
    //微信支付成功支付后跳转的地址
    public final static String SUCCESS_URL = "http://wx.douyamovie.com";
    //订单查询接口(POST)
    public final static String CHECK_ORDER_URL = "https://api.mch.weixin.qq.com/pay/orderquery";
    public static String CreateNoncestr(int length) {
        String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        String res = "";
        for (int i = 0; i < length; i++) {
            Random rd = new Random();
            res += chars.indexOf(rd.nextInt(chars.length() - 1));
        }
        return res;
    }

    public static String CreateNoncestr() {
        String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        String res = "";
        for (int i = 0; i < 16; i++) {
            Random rd = new Random();
            res += chars.charAt(rd.nextInt(chars.length() - 1));
        }
        return res;
    }
    /**
     * @Description:sign签名
     * @param characterEncoding 编码格式
     * @param parameters 请求参数
     * @return
     */
    @SuppressWarnings("unchecked")
    public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){
        StringBuffer sb = new StringBuffer();
        Set es = parameters.entrySet();
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            Object v = entry.getValue();
            if(null != v && !"".equals(v)
                    && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + API_KEY);
        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
        return sign;
    }
    /**
     * @Description:将请求参数转换为xml格式的string
     * @param parameters  请求参数
     * @return
     */
    @SuppressWarnings("unchecked")
    public static String getRequestXml(SortedMap<Object,Object> parameters){
        StringBuffer sb = new StringBuffer();
        sb.append("<xml>");
        Set es = parameters.entrySet();
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            String v = (String)entry.getValue();
            if ("attach".equalsIgnoreCase(k)||"body".equalsIgnoreCase(k)||"sign".equalsIgnoreCase(k)) {
                sb.append("<"+k+">"+"<![CDATA["+v+"]]></"+k+">");
            }else {
                sb.append("<"+k+">"+v+"</"+k+">");
            }
        }
        sb.append("</xml>");
        return sb.toString();
    }
    /**
     *
     * getPrepayId(调用微信统一下单接口,生成微信预支付id)
     * @param totalFee    支付金额
     * @param ipAddress   ip地址
     * @param orderNumber 订单号
     * @param body        商品或支付单简要描述
     * @param openid      trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识
     * @return
     * @throws Exception
     * @throws
     */
    @SuppressWarnings("unchecked")
    public static Map<String, String>  getPrepayId(String totalFee,String ipAddress,String orderNumber,String body,String openid,String attach) throws Exception{
        SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
        parameters.put("appid", APPID);
        parameters.put("mch_id", MCH_ID);
        parameters.put("nonce_str", CreateNoncestr());
        parameters.put("body", body);
        parameters.put("out_trade_no", orderNumber);
        parameters.put("total_fee", totalFee);
        parameters.put("attach",attach);
        parameters.put("spbill_create_ip",ipAddress);
        parameters.put("notify_url",NOTIFY_URL);
        parameters.put("trade_type", "JSAPI");
        parameters.put("openid", openid);
        String sign = PayCommonUtil.createSign("UTF-8", parameters);
        parameters.put("sign", sign);
        String requestXML = PayCommonUtil.getRequestXml(parameters);
        String result =CommonUtil.httpsRequest(UNIFIED_ORDER_URL, "POST", requestXML);
        log.info("getPrepayId"+result);
        Map<String, String> map = XMLUtil.doXMLParse(result);//解析微信返回的信息,以Map形式存储便于取值
        return map;
    }
    /**
     *
     * createPackageValue(调起支付)
     * @param //appid
     * @param //appKey
     * @param prepay_id
     * @return
     * @throws
     * @author 小帅帅
     * @date  2016-7-5下午01:41:54
     */
    public static String createPackageValue(String prepay_id)  {
        SortedMap<Object,Object> params = new TreeMap<Object,Object>();
        params.put("appId", APPID);
        params.put("timeStamp", Long.toString(new Date().getTime()));
        params.put("nonceStr", PayCommonUtil.CreateNoncestr());
        params.put("package", "prepay_id="+prepay_id);
        params.put("signType", SIGN_TYPE);
        String paySign =  PayCommonUtil.createSign("UTF-8", params);
        params.put("packageValue", "prepay_id="+prepay_id);    //这里用packageValue是预防package是关键字在js获取值出错
        params.put("paySign", paySign);                                                          //paySign的生成规则和Sign的生成规则一致
        params.put("sendUrl", SUCCESS_URL);                               //付款成功后跳转的页面
        String json = JSONObject.toJSONString(params);
        log.info("createPackageValue"+json);
        return json;
    }
}
### 回答1: 公众号微信支付是一种便捷的支付方式,为用户和商家提供了安全、便利的交易体验。完整的公众号微信支付demo源码包含支付和退款功能。 在支付功能方面,源码应包含以下主要模块: 1. 用户下单:用户在公众号中选择商品并下单,生成订单号和相应的支付金额。 2. 支付接口调用:源码需要在后台调用微信支付接口,将订单信息传递给微信支付平台,并生成一个支付链接。 3. 支付结果回调:在用户支付完成后,微信支付平台会回调指定的接口,通知商家支付结果。源码需要接收并处理这些支付结果,如更新订单状态、生成交易记录等。 在退款功能方面,源码应包含以下主要模块: 1. 退款申请:用户在公众号中选择需要退款的订单,提交退款申请,并提供相应的退款金额等信息。 2. 退款接口调用:源码需要在后台调用微信支付平台的退款接口,将退款申请信息传递给微信支付平台,并生成一个退款请求。 3. 退款结果回调:微信支付平台在退款成功或失败后,会回调指定的接口,通知商家退款结果。源码需要接收并处理这些退款结果,如更新订单状态、生成退款记录等。 为了保证支付和退款过程的安全性和可靠性,源码应考虑以下方面: 1. 数据加密:用户和商家的敏感数据在传输过程中应进行加密处理,确保数据的安全。 2. 异常处理:源码应对支付和退款接口调用过程中的异常情况进行处理,例如网络中断、支付平台系统错误等。 3. 数据验证:源码应对支付和退款申请的数据进行验证,确保数据的完整性和准确性。 4. 日志记录:源码应生成详细的日志记录,以便商家对支付和退款过程进行审计和追踪。 总之,一个完整的公众号微信支付demo源码应包含支付和退款功能,并考虑到安全性、可靠性和易用性的要求。 ### 回答2: 公众号微信支付是指通过微信公众号进行支付的一种支付方式。使用公众号微信支付的完整demo源码需要涵盖以下内容: 1. 微信公众号的认证和配置:需要先在微信公众平台上注册一个公众号,并进行认证和配置,获取相应的公众号APPID和APPSECRET。 2. 微信支付的配置:在公众号后台配置支付的相关参数,如商户号(MCH_ID)、支付密钥(API_KEY)等。 3. 生成预支付订单:用户在公众号内选择商品后,需要向微信支付接口发送统一下单请求,生成预支付订单,并获取到预支付ID(prepay_id)。 4. 生成支付签名:根据微信支付接口的要求,使用预支付ID、商户号、时间戳等参数生成支付签名。 5. 调起微信支付:在公众号内显示支付按钮,并将支付签名、订单号等信息传递给微信支付接口,调起微信支付页面供用户进行支付。 6. 支付结果回调:用户完成支付后,微信支付会发送支付结果通知给公众号后台,需要在后台进行相应的处理。 7. 退款功能:如果用户需要退款,需要向微信支付接口发送退款请求,并验证退款结果。 公众号微信支付的完整demo源码需要包含以上步骤的实现,其中关键的部分是生成预支付订单、生成支付签名和支付结果回调的处理。这些部分需要根据具体的开发语言和框架进行实现,同时也需要调用微信支付接口提供的API来完成支付和退款的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haibo8023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值