1:微信支付分很多种方式  如下图。这里单独讲解一下H5的支付,也就是微信公众号里面的支付方式

https://pay.weixin.qq.com/wiki/doc/api/index.html

微信支付功能流程

2:在支付时一般会有一个选择支付方式页面。如下图,下订单成功后,跳转到选择支付方式页面。当如还要加一个微信支付功能

微信支付功能流程

 

3:如果选择微信支付,这里会需要再自定义一个页面,显示具体的支付详细。一般需要有 

支付金额  支付订单号  以及支付备注信息    

点击支付按钮 这里才是真正的支付功能

4:支付方式 。这里需要使用监听微信支付

 微信支付功能流程

 

5:上面还没有真正的调用微信支付功能,在调用 onBridgeReady 方法时才调用微信支付

onBridgeReady里面是具体的微信支付代码。在调用微信支付的时候需要用到一些参数,签名,时间戳 所以这些可以在服务端去获取一下。例如:  这里面先是调用 pi.WepayReady  方法,这个方法是获取签名 ,以及商户号 ,签名方式等等

  onBridgeReady() {

            var param = new this.URLSearchParam();

            param.append('parentNo', this.parentNo);

            param.append('code', this.code);

            param.append('type', this.orderType);

            param.append('i998', true);

            var that = this;

            that.shelter(false);

            this.$http.post(api.WepayReady(), param.toParam()).then((res) => {

                that.shelter(true);

                if (!res.Result) {

                    window.alert(res.Message);

                    return;

                }

                WeixinJSBridge.invoke('getBrandWCPayRequest', {

                    "appId": res.Data.appId,     //公众号名称,由商户传入     

                    "timeStamp": res.Data.timeStamp,         //时间戳,自1970年以来的秒数     

                    "nonceStr": res.Data.nonceStr, //随机串     

                    "package": res.Data.package,

                    "signType": "MD5",         //微信签名方式:     

                    "paySign": res.Data.paySign //微信签名 

                }, function(res) {

                    if (res.err_msg == "get_brand_wcpay_request:ok") {

                        if (that.orderType == 0) {

                            //window.location.href="https://i.998.com/home/order?t="+Math.random();

                            that.$router.push({ path: '/home/order' });

                        } else if (that.orderType == 1) {

                            //window.location.href="https://i.998.com/home/wallet?t="+Math.random();

                            that.$router.push({ path: '/wallet/valueCardDetail' });

                        } else if (that.orderType == 2) {

                            that.$router.push({ path: '/user/Breakfast' });

                        } else {

                            //window.location.href="https://i.998.com/home/index?t="+Math.random();

                            that.$router.push({ path: '/home/index' });

                        }

                    } else if (res.err_msg == "get_brand_wcpay_request:cancel") {

                        window.alert("交易取消");

                    } else {

                        window.alert("交易失败");

                    }

 

                    if (that.orderType == 0) {

                        that.$router.push({ path: '/home/order' });

                    } else if (that.orderType == 1) {

                        that.$router.push({ path: '/wallet/valueCardDetail' });

                    } else if (that.orderType == 2) {

                        that.$router.push({ path: '/user/Breakfast' });

                    } else {

                        that.$router.push({ path: '/home/index' });

                    }

     })}); },

6:WepayReady是服务端方法,主要用于返回获取签名 ,以及商户号 ,签名方式等等

这里只是显示  控制器接口,里面会有详细代码,主要方式就是获取签名信息

微信支付功能流程

 

7:调用WeixinJSBridge.invoke('getBrandWCPayRequest', 这个方法,返回值为:

   if (res.err_msg == "get_brand_wcpay_request:ok") {  支付成功    }

 else if (res.err_msg == "get_brand_wcpay_request:cancel") {

                        window.alert("交易取消");

                    } else {

                        window.alert("交易失败");

                    }

 

8:在传的参数  package里面需要注意,是一个xml  。里面有支付回调方法

例如: String prepay_id = WepayUtil.GetPrepayId(order, paySignKey);

GetPrepayId方法具体代码如下:

微信支付功能流程

9:GetUnifiedOrderXml方法的明细

 public static string GetUnifiedOrderXml(UnifiedOrder order, string key)
        {
            string return_string = string.Empty;
            SortedDictionary<string, string> sParams = new SortedDictionary<string, string>();
            sParams.Add("appid", order.appid);  /// 公共号ID(微信分配的公众账号 ID)
            sParams.Add("attach", order.attach); // 附加数据,原样返回
            sParams.Add("body", order.body);  // 商品描述
            sParams.Add("device_info", order.device_info); // 微信支付分配的终端设备号
            sParams.Add("mch_id", order.mch_id); // 商户号(微信支付分配的商户号)
            sParams.Add("nonce_str", order.nonce_str); // 随机字符串,不长于 32 位
            sParams.Add("notify_url", order.notify_url);  // 接收微信支付成功通知
            sParams.Add("openid", order.openid); /// 用户标识 trade_type 为 JSAPI时,此参数必传
            sParams.Add("out_trade_no", order.out_trade_no);// 商户系统内部的订单号,32个字符内、可包含字母,确保在商户系统唯一,详细说明
            sParams.Add("spbill_create_ip", order.spbill_create_ip);// 终端IP
            sParams.Add("total_fee", order.total_fee.ToString()); // 订单总金额,单位为分,不能带小数点
            sParams.Add("trade_type", order.trade_type);// JSAPI、NATIVE、APP
            order.sign = GetSign(sParams, key);
            sParams.Add("sign", order.sign);

            //拼接成XML请求数据
            StringBuilder sbPay = new StringBuilder();
            foreach (KeyValuePair<string, string> k in sParams)
            {
                if (k.Key == "attach" || k.Key == "body" || k.Key == "sign")
                {
                    if (k.Key == "body")
                    {
                        byte[] byteArray = Encoding.UTF8.GetBytes(k.Value);
                        string tempString = Encoding.UTF8.GetString(byteArray);
                        sbPay.Append("<" + k.Key + "><![CDATA[" + tempString + "]]></" + k.Key + ">");
                    }
                    else
                    {
                        sbPay.Append("<" + k.Key + "><![CDATA[" + k.Value + "]]></" + k.Key + ">");
                    } 
                }
                else
                {
                    sbPay.Append("<" + k.Key + ">" + k.Value + "</" + k.Key + ">");
                }
            }
            return_string = string.Format("<xml>{0}</xml>", sbPay.ToString());
            //byte[] byteArray = Encoding.UTF8.GetBytes(return_string);
            //return_string = Encoding.UTF8.GetString(byteArray);
            return return_string;

        }
 

 

 

 

 

 

 

 

 

 

 

 

 

 

            

       

 

 

 

 

 

 

 

 

相关文章: