• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#微信支付V2

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 
这里我选择的是Native支付、API文档是V2.(文档V3与V2区别)
 
 
模式一:开发前,商户必须在公众平台后台设置支付回调URL。URL实现的功能:接收用户扫码后微信支付系统回调的productid和openid;

 

 

模式二:商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。
注意:code_url有效期为2小时,过期后扫码不能再发起支付。

 

 

模式一是先根据微信支付规定格式生成二维码,当客户扫描之后通知微信支付系统,微信系统再和商户后台系统进行一系列的操作最终发起用户端支付流程(需设置支付回调url),而
模式二则更加简单,是先在商户后台系统生成订单信息,然后就调用微信系统的统一下单api,商户系统将返回的结果生成二维码供用户扫描即可.
 

 

 

 
 
四、设置必填参数
我这里选择的是c#,运行需要设置三个参数,又因为选择模式二,还需要设置NotifyUrl
APPID:绑定支付的APPID
MCHID:商户号(必须配置)
KEY:商户支付密钥,参考开户邮件设置(必须配置),请妥善保管,避免密钥泄露
NotifyUrl:支付结果通知回调url,用于商户接收支付结果
  1. 获取APPID需要看下图,微信支付账号是没有APPID的,所以需要APPID必须关联微信的公众平台或开放平台才可以拥有APPID.(支付平台关联APPID的连接),关联之后需要微信公众/开放平台审核通过.

  

 

 

 

 

  1. 获取MCHID,一般微信支付号申请的规则都是 xxx@MCHID,所以查看自己登陆账号@字符后面的内容就是MCHID.或者在上方导航栏中  交易中心--->电子凭证--->商户号 
  2. 设置KEY    账户中心--->API安全--->API秘钥         设置秘钥需要32个字符,只允许输入数字和英文大小写字母的组合。(var token =Guid.NewGuid().ToString("N"))
  3. NotifyUrl 填写自己项目接受微信支付通知的地址(外网可访问),开发时可用花生壳.

五、开发中遇到的坑

  1.total_fee(总金额)单位为/分,与支付宝默认金额/元不一致.

  2.传递的参数中不能包含中文字符.由于demo中默认的签名算法是 HMAC-SHA256,而CalcHMACSHA256Hash()中使用的Encoding.Default(Windwos默认是gbk). 

    所以只需将 WxPayData.CalcHMACSHA256Hash() 方法中的 Encoding.Default 改为Encoding.UTF8 即可.  

  3.通知回调函数中校验签名时出错,将接受到的xml转化为WxPayData,然后调用CheckSign(WxPayData.SIGN_TYPE_HMAC_SHA256)出错的原因是因为MakeSign

    方法中如果选择的是WxPayData.SIGN_TYPE_HMAC_SHA256他默认加密后得值为小写,而回调函数中的sign为大写.所以只需将 WxPayData.MakeSign() 中的

    CalcHMACSHA256Hash() 方法的值ToUpper()之后再返回就OK了.(我的Notify方法)

        [HttpPost]
        [AllowAnonymous]
        public string Notify()
        {
            Stream inputstream = Request.InputStream;
            byte[] b = new byte[inputstream.Length];
            inputstream.Read(b, 0, (int)inputstream.Length);
            string inputstr = Encoding.UTF8.GetString(b);

            SiteHelper.LogPayInfo($"WxPayApi PayResult :{inputstr.ToJson()}");
            WxPayData _reciveResult = new WxPayData();
            _reciveResult.FromXml(inputstr);
            //校验签名以及查询结果
            if (!_reciveResult.CheckSign(WxPayData.SIGN_TYPE_HMAC_SHA256)
             || _reciveResult.GetValue("result_code").ToString() !="SUCCESS"
             || _reciveResult.GetValue("return_code").ToString() != "SUCCESS")
            {
                WxPayData _returnErrResult = new WxPayData();
                _returnErrResult.SetValue("return_code", "FAIL");
                _returnErrResult.SetValue("return_msg", "ERR");
                return _returnErrResult.ToXml();
            }
            //ToDo 查询数据库订单金额与参数中的金额对比,以及修改数据库订单状态
            WxPayData _returnResult = new WxPayData();
            _returnResult.SetValue("return_code", "SUCCESS");
            _returnResult.SetValue("return_msg", "OK");
            return _returnResult.ToXml();
           }         

 

 

 

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#语法糖系列——第二篇:聊聊ref,in修饰符底层玩法发布时间:2022-07-18
下一篇:
国外C#开源系统一览表,C#OpenSource发布时间:2022-07-18
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap