微信小程序 支付功能 小白版本

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42948485/article/details/81634165

微信小程序支付 小白版本 C#

微信小程序中用到在线支付功能,要在小程序里实现微信支付还是很方便的,下面我就具体说一下小程序里微信支付的开发流程和注意点。
1.首先看一下官方的文档,然后接着往下看。
这里写图片描述
1.1**简述官方文档**
查看小程序支付中的业务流程不难发现,整个支付过程简单而易于操作。
白话分析:想要完成支付,那么你需要做以下几件事。
1.小程序获取到使用人的openid。wx.login({})即可。(并不是直接返回openid,login获得code,进行处理后得到。)
2.统一下单,生成个订单,表明要发起支付了,产生订单。
3.订单产生,会返回给你一些必要的参数,具体参数可以查看官方文档。
4.回调,支付成功由微信端进行。(在下单API中已经加入了回调的URL)

下面简述开发流程

1.开通微信支付和微信商户号
这个过程就和开通服务号的微信支付过程一样,没有什么可以说的。
这里写图片描述

2.获取openid
需要在小程序的客户端js中获取当前用户的openid。
通过调用wx.login方法可以得到用户的code,然后开发者服务器使用登录凭证 code 获取 openid。
//以下是小程序js代码

wx.login({
  success: function(res) {
    if (res.code) {
      wx.request({
        url: '你的服务端地址',
        method: 'POST',
        data: {
          code: res.code
        },
        success: function(res) {
            //成功返回openid
            var openid = res.data.openid;
        },
        fail: function(err) {
            console.log(err)
        }
      })
    } else {
      console.log('获取用户登录态失败!' + res.errMsg)
    }
  }
});

//以下是服务端代码
//1.微信API返回openid

   //SnsApi:引用进来。Appid:小程序的Appid。Secret:小程序的Secret
   var jsonResult = SnsApi.JsCode2Json(Appid, Secret, request.Data);
   //得到unionid
   var unionid = jsonResult.unionid;
   //得到openid 
   var openid = jsonResult.openid;

3.生成统一订单
直接上代码,参数有明确备注,但有些参数需要闹明白是什么

//创建键值对
  var dic = new Dictionary<string, string>
            {
                    {"appid", wx_appid},    //微信appid
                    {"body",wx_body},     //body 商品简单描述
                    {"mch_id", wx_mch_id},   //商户号    ●注意
                    {"nonce_str", nonce_str},    //随机字符串(20)
                    {"notify_url",notify_url},//异步通知的地址
                    {"openid",openid},    //openid   wx.login({})返回的
                    {"out_trade_no","168168168"},//商户自己的订单号码
                    {"spbill_create_ip","192.168.1.168"},//IP地址
                    {"total_fee",1},   //支付多少钱
                    {"trade_type","JSAPI" },   //交易类型  JSAPI
       };
        //加入签名
        dic.Add("sign", GetSignString(dic, wx_key));  //▲ 这个得说一下,key是商户的 Secret。(千万不要搞成小程序的)

        var sb = new StringBuilder();
        sb.Append("<xml>");
        foreach (var d in dic)
        {
            sb.Append("<" + d.Key + ">" + d.Value + "</" + d.Key + ">");
        }
        sb.Append("</xml>");
        var xml = new XmlDocument();
        CookieCollection coo = new CookieCollection();
        Encoding en = Encoding.GetEncoding("UTF-8");
        //CreatePostHttpResponse();

        //访问微信统一下单接口,将参数传递过去,生成订单。

        HttpWebResponse response = CreatePostHttpResponse("https://api.mch.weixin.qq.com/pay/unifiedorder", sb.ToString(), en, wx_mch_id);
        Stream stream = response.GetResponseStream();
        StreamReader sr = new StreamReader(stream);
        string html = sr.ReadToEnd();
        xml.LoadXml(html);
        DataSet ds = new DataSet();
        StringReader stram = new StringReader(html);
        XmlTextReader reader = new XmlTextReader(stram);
        ds.ReadXml(reader);
        string return_code = ds.Tables[0].Rows[0]["return_code"].ToString();

        //返回信息。

        if (return_code.ToUpper() == "SUCCESS")
        {
            string result_code = ds.Tables[0].Rows[0]["result_code"].ToString();
            if (result_code.ToUpper() == "SUCCESS")
            {
                var res = new Dictionary<string, string> {
                    {"appId",wx_appid},
                    {"nonceStr",ds.Tables[0].Rows[0]["nonce_str"].ToString()},
                    {"package","prepay_id="+ds.Tables[0].Rows[0]["prepay_id"].ToString()},
                    {"signType","MD5"},
                    {"timeStamp",GetTimeStamp()},
                };
                res.Add("paySign", GetSignString(res, wx_key));
                pay.timeStamp = res["timeStamp"];
                pay.nonceStr = res["nonceStr"];
                pay.package = res["package"];
                pay.paySign = res["paySign"];
                pay.wx_out_trade_no = wx_out_trade_no;
            }
        }

4.再次签名,发起支付
小程序提供的支付API,涉及参数都在统一下单的返回结果中。将这些参数进行拼装,在小程序中粘贴以下代码,发起支付。

                    wx.requestPayment(
                    {
                                    'timeStamp': '',
                                    'nonceStr': '',
                                    'package': '',
                                    'signType': 'MD5',
                                    'paySign': '',
                                    'success':function(res){
                                        //成功。处理逻辑
                                        //▲这也是坑之所在,很多人都认为这已经是支付完成后了。错了,当用户完成支付,进入微信自己的完成页面(非自己设计)用户不点击完成,是不触发该方法的。必须要注意,自己的业务逻辑写在这里是错误的。这就需要用到下一步的,回调(在统一下单时输入的回调URL)▲
                                    },
                                    'fail':function(res){},
                                    'complete':function(res){}
                    })

5.支付成功后的回调
一般涉及到交易,金钱来往都是很重要的一环。最不可缺少的就是交易记录。如果只是等待用户去触发交易完成,后果可想而知。下面说一下成功后的回调。
在统一下单输入了回调的URL,在成功后,微信会回调你多次,一直到成功为止。
请参考自身业务进行编写代码。

展开阅读全文

没有更多推荐了,返回首页