asp.net mvc内微信pc端、H5、JsApi支付方式总结

转自:http://www.80cxy.com/Blog/ArticleView?arId=201912122203555530g0wwI8

本文提供技术支持QQ:806693619   V:kwstugdb

微信提供了各种支付方式,有针对手机APP开发的支付方式,有针对pc web端的,手机端的等,pc端支付使用场景是在pc端完整内使用的支付方式,JsApi只能在微信内被调用,H5不限于微信内使用,手机端浏览器内也可以使用,个人理解的不知道对不对,本文主要介绍pc端、H5、JsApi支付方式,废话不多说直接上代码,代码只提供JsApi部分,pc端web及H5端的代码直接下载附件,附件内包括全部代码及相关类库。

微信JsApi支付之前必须通过后台获取支付调起参数,参数获得后通过js方法调起支付才行。

一、前端支付Js代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53


<script>

        var _wxJsApiParam;

        function callpay() {

            if (typeof WeixinJSBridge == "undefined") {

                if (document.addEventListener) {

                    document.addEventListener(‘WeixinJSBridgeReady‘, jsApiCall, false);

                }

                else if (document.attachEvent) {

                    document.attachEvent(‘WeixinJSBridgeReady‘, jsApiCall);

                    document.attachEvent(‘onWeixinJSBridgeReady‘, jsApiCall);

                }

            }

            else {

                jsApiCall();

            }

        }

        //调用微信JS api 支付

        function jsApiCall() {

            WeixinJSBridge.invoke(‘getBrandWCPayRequest‘, _wxJsApiParam,

              function (res) {

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

                      $.messager.alert(‘提示信息‘, ‘支付已经取消!‘, ‘info‘);

                      return false;

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

                      //支付成功

                      $.messager.alert(‘提示信息‘, ‘支付成功!‘, ‘info‘);

                  }

              });

        }

        //获取微信支付参数

        function rePay(obj) {

            //调起微信公众号JsApi支付

            $.ajax({

                url: "/Pay/RePayJsApi",

                type: ‘post‘,

                cache: false,

                dataType: ‘html‘,

                data: {

                    OrderId: obj

                },

                success: function (data) {

                    if (data != "Error") {

                        _wxJsApiParam = eval(‘(‘ + data + ‘)‘);

                        callpay();

                    }

                    else $.messager.alert(‘提示信息‘, ‘生成订单失败!‘, ‘info‘);

                },

                error: function (XMLHttpRequest, textStatus, errorThrown) {

                    alert(textStatus); return;

                }

            });

        }

    </script>

二、后台代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88


/// <summary>

/// 重新发起支付

/// </summary>

/// <param name="tmpModel"></param>

/// <returns></returns>

[HttpPost]

public ActionResult RePayJsApi()

{

    try

    {

        string orderId = ClassesLib.GetString("OrderId");

        string newOrderId = ClassesLib.GetIdByTime();

        var model = db.MEMBER_ORDER.Find(orderId);

        model.ORDERID = newOrderId;

        db.SaveChanges();

        //登录判断

        if (ClassesLib.WxSessionIsNull())

        {

            return Content("<script>alert(‘登录超时,请重新登录!‘);window.location.href=‘/WeiXin/Login?returnUrl=/WeiXin/ViewProduct?objId=" + model.OBJECTID + "&salesmanId=" + model.SALEID + "‘</script>");

        }

        //调用支付

        JsApiPay jsApiPay = new JsApiPay();

        jsApiPay.bodyStr = model.OBJECTNAME + "-" + ClassesLib.getWxLoginName();

        jsApiPay.attachStr = model.OBJECTNAME + "-" + ClassesLib.getWxLoginName();

        jsApiPay.orderId = newOrderId;

        jsApiPay.openid = model.OPENID;

        jsApiPay.total_fee = Convert.ToInt32(model.MONEY * 100);//测试 订单金额(1表示分,正式金额要*100)

        //JSAPI支付预处理

        //调用统一下单,获得下单结果

        WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult();

        //从统一下单成功返回的数据中获取微信浏览器调起jsapi支付所需的参数

        var wxJsApiParam = jsApiPay.GetJsApiParameters(); //获取到的是json格式字符串

        return Content(wxJsApiParam);

    }

    catch (Exception e)

    {

        return Content("Error");

    }

}

[HttpPost]

public virtual ActionResult JsApiNotifyUrl()

{

    ClassesLib.InsertLog("支付测试1", "支付");

    WxPayData notifyData = GetNotifyData();

    //检查支付结果中transaction_id是否存在

    if (!notifyData.IsSet("transaction_id"))

    {

        //若transaction_id不存在,则立即返回结果给微信支付后台

        WxPayData res = new WxPayData();

        res.SetValue("return_code", "FAIL");

        res.SetValue("return_msg", "支付结果中微信订单号不存在");

        Log.Error(this.GetType().ToString(), "The Pay result is error : " + res.ToXml());

        return Content("支付结果中微信订单号不存在");

    }

    ClassesLib.InsertLog("支付测试2", "支付");

    string transaction_id = notifyData.GetValue("transaction_id").ToString();

    string trade_no = notifyData.GetValue("out_trade_no").ToString();

    //查询订单,判断订单真实性

    if (!QueryOrder(transaction_id))

    {

        //若订单查询失败,则立即返回结果给微信支付后台

        WxPayData res = new WxPayData();

        res.SetValue("return_code", "FAIL");

        res.SetValue("return_msg", "订单查询失败");

        Log.Error(this.GetType().ToString(), "Order query failure : " + res.ToXml());

        return Content("订单查询失败");

    }

    //查询订单成功

    else

    {

        ClassesLib.InsertLog("支付测试3", "支付");

        WxPayData res = new WxPayData();

        res.SetValue("return_code", "SUCCESS");

        res.SetValue("return_msg", "OK");

        Log.Info(this.GetType().ToString(), "order query success : " + res.ToXml());

        //更新支付状态

        var model = db.MEMBER_ORDER.Where(c => c.ORDERID == trade_no).FirstOrDefault();

        if (model != null && model.PAYSTATE == "未支付")

        {

            model.PAYSTATE = "已支付";

            model.PAYDATE = DateTime.Now;

            //发送支付成功提示,通过微信消息通知收银员已经收到付款

            SendTemplateMessage.SendMessage("oPCLNv5B1T8kYM5AYgXWHOiD24_s", "您好,用户" + model.MEMBERNAME + "已购买服务", model.OBJECTNAME, (Convert.ToDouble(model.MONEY) * 0.01).ToString() + "元", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));

            db.SaveChanges();

        }

        return Content("支付成功" + res.ToXml());

    }

}

原文地址:https://www.cnblogs.com/kwstu2018/p/12033155.html

时间: 2024-10-13 13:18:02

asp.net mvc内微信pc端、H5、JsApi支付方式总结的相关文章

微信开发】【Asp.net MVC】-- 微信分享功能

[微信开发][Asp.net MVC]-- 微信分享功能 2017-01-15 09:09 by stoneniqiu, 12886 阅读, 15 评论, 收藏, 编辑 内嵌在微信中的网页,右上角都会有一个默认的分享功能.如下图所示,第一个为自定义的效果,第二个为默认的效果.实现了自定义的分享链接是不是更让人有点击的欲望?下面讲解下开发的过程. 一.准备,设置js接口安全域名 这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名.打开这个页

ASP.NET MVC 接入微信公共平台

ASP.NET MVC 接入微信公共平台 申请微信公共账号 既然要接入微信公共平台,微信公共号是必须的(当然如果只是测试的话也可以申请微信公共平台接口测试账号),来这里微信公共平台 申请微信公共号(注:申请微信公共号不能用已绑定微信的邮箱),微信公共平台有自己的官方文档,官方文档有不少资料,可以多看看,开发者模式默认是关闭的,需要配置并启用,如下图: URL即你的网站处理微信模块,必须是HTTP://开头的网站,笔者自己之前接入几天一直失败,最终发现是因为自己网站加密了用的是HTTPS,这个需要

ASP.NET MVC Display Mode 移动端视图 配置对微信内置浏览器的识别

最近在捣鼓一个稍微有点low的商城网站,没有计划做app却要求有个wap版,而前端又没有做成响应式,时间WTF,直接利用了asp.net mvc的Display Mode Provider. 使用方式依照上面的链接地址,asp.net mvc application启动的时候会在全局变量 DisplayModeProvider.Instance.Modes 集合中加入 DisplayModeId == "Mobile" 的 IDisplayMode ,因此如果想要在移动端浏览器中展示移

【微信开发】【Asp.net MVC】-- 微信分享功能

内嵌在微信中的网页,右上角都会有一个默认的分享功能.如下图所示,第一个为自定义的效果,第二个为默认的效果.实现了自定义的分享链接是不是更让人有点击的欲望?下面讲解下开发的过程. 一.准备,设置js接口安全域名 这需要使用微信的jssdk,先需要在微信公众号后台进行设置:公众号设置-->功能设置-->JS接口安全域名.打开这个页面之后你会看到下面的提示.需要先下载这个文件并上传到指定域名的根目录. 这个文件里面是一个字符串,从名称看是用来校验用的.先上传了这个文件,你才能保存成功.这样你就可以使

ASP.NET MVC+EF在服务端分页使用jqGrid以及jquery Datatables的注意事项

引言: 本人想自己个博客网站出来,技术路线是用ASN.NET MVC5+EF6(Code First)+ZUI+各种Jquery插件,有了这个想法之后就开始选择UI,看了好多bootstrap的模板之后,发现即使你用了bootstrap还是要自己写css样式,都是自学的,前端真的很垃圾,在网上找了很多UI,以下是各种UI的地址,需要的可以去看看: H-ui:http://www.h-ui.net/H-ui.admin.shtml ,是一个前端大牛弄得,模仿bootstrap,做适合中国网上的UI

微信PC端授权页面提示授权入口所在域名为空

做第三方微信平台的时候做授权页面,用window.open方法从第三方平台页面打开新的授权标签页. 在IE浏览器上出问题,提示如下: 在chrome和firefox浏览器上正常. 搜了一下,发现微信是通过授权页面请求的referrer头部来判断请求的域名的. 目前的IE浏览器(<=11)似乎对于open方法打开的标签页不附带referrer头部,所以获取的授权入口页域名为空. 解决办法: 不使用window.open,直接在本标签页打开(window.location.href),授权结束之后再

ASP.NET MVC 支持微信OpenId登陆

之前微信的网站都是使用的是identity来做用户登录的,用户都是要每次输入用户账号和密码.然后identity把用户信息保存在本地一段时间.现在是需要当用户在登录的时候绑定当前的微信账户的OpenId,通过OpenId来获取用户信息实现自动登录. 在用户进入Login这个Action之前,获取到OpenId,判断该OpenId是否绑定用户信息,如果绑定则自动登陆,并返回redirectUrl.否则把OpenId保存到Cookie,然后跳转到LoginAction,在登录验证成功之后把OpenI

微信pc端和手机上传处理

一.原因 在微信通过电脑版和浏览器登录时,调用了微信上传的接口,wx.getLocalImgData或返回失败. 没办法,只有处理当电脑上传时,使用ajaxuploadfile上传. 二.方法 function upload_weixin_pic(e) { e=e||{}; e={ id:e.id||'get_pic_url', hight:e.hight||0, width:e.width||0, chooseImage:function () { wx.chooseImage({ count

ASP.NET MVC开发微信(一)

public string index(string echostr) { return echostr; }