Abp.WeChat 微信支付

关于使用Abp.WeChat的记录

官方文档其实写的很清楚了 但是因为是小白第一次做,还是有很多读不懂的地方 下面做一个简单的记录

官方地址:https://github.com/EasyAbp/Abp.WeChat
官方使用说明:https://github.com/EasyAbp/Abp.WeChat/blob/master/docs/WeChatPay.md

微信支付:后端所需要的工作

1 前端访问支付用户同意授权,获取code,有两种情况:

(1)snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
(2)授权成功后,页面将跳转至 redirect_uri/?code=CODE&state=STATE
(3)此时前端将获取的code上送给后台

2 后台通过code获取openid

 public static string getopenid(string code)
        {
            string strJson = " ";
            string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx75550f6c7370fbc7&secret=41051f79b41945423195c72d3df54131&code=" + code + "&grant_type=authorization_code";

            //获取openid
            // //// 链接地址
            ////https://open.weixin.qq.com/connect/oauth2/authorize?appid=11111111111111111111111111111&redirect_uri=22222222222222222&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 
            //int id = Convert.ToInt32(Request.QueryString["ID"]);
            //string code = Request["code"].ToString();
            string html = string.Empty;
            //string url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=11111111111111111111111111111111111&secret=2222222222222222222222228&code=" + code + "&grant_type=authorization_code";
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Method = "GET";
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            Stream ioStream = response.GetResponseStream();
            StreamReader sr = new StreamReader(ioStream, Encoding.UTF8);
            html = sr.ReadToEnd();
            sr.Close();
            ioStream.Close();
            response.Close();

            string key = "\"openid\":\"";
            int startIndex = html.IndexOf(key);
            if (startIndex != -1)
            {
                int endIndex = html.IndexOf("\",", startIndex);
                string openid = html.Substring(startIndex + key.Length, endIndex - startIndex - key.Length);
                //MyOpenId.Value=openid;
                return openid;

            }
            else
            {
                return "找不到OpenidID";
            }
        }

3 获取openid后,后台进行统一下单(我是叫前端直接传code和金额,后台获取penid后直接统一下单,把这两步放在了一个接口里面)

      [HttpGet]
        public async Task<UnifiedOrderResultDto> UnifiedOrder([FromQuery] UnifiedOrderDto input)
        {
            //元转分
            int money = int.Parse((input.Money * 100).ToString("0"));

            //
            string openid = GetOpenId.getopenid(input.Code);
            if (openid == "找不到OpenidID")
            {
                //return null;
                throw new ArgumentException($"当交易类型为 JsApi 时,参数 {nameof(openid)} 必须传递有效值。");
            }
            //订单号(当前时间和随机数)
            var ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            var times = Convert.ToInt64(ts.TotalSeconds).ToString();
            Random rd = new Random();
            var num = rd.Next().ToString();
            var OrderNum = times + num;

            var result = _ordinaryMerchantPayService.UnifiedOrderAsync(
        "你的 AppId",
        "你的商户 Id",
        "订单的描述信息",
        "附加数据",
        OrderNum,//"20150806125346",//"订单号", 订单号需要你自己生成,长度不超过 32 位。
        money, // 支付金额,单位是分。
        TradeType.JsApi,// 交易类型。
        openid//你的openId
        ).Result;

            var str = result.OuterXml;

            //加个判断 是成功还是失败
            string[] sArray1 = str.ToString().Split(new string[] { "<return_code><![CDATA[", "]]></return_code>" }, StringSplitOptions.RemoveEmptyEntries);
            if(sArray1[1]== "FAIL")
            {
                throw new ArgumentException($"当交易类型为 JsApi 时,统一下单失败。");
            }
            //成功 //截取id
            string[] sArray = str.Split(new string[] { "<prepay_id><![CDATA[", "]]></prepay_id>" }, StringSplitOptions.RemoveEmptyEntries);
            //返回值
            UnifiedOrderResultDto dto = new UnifiedOrderResultDto();
            dto.appId = "你的 AppId";
            dto.prepayId = sArray[1];
            return dto;
        }

对应的实体:

 public class UnifiedOrderDto
    {
        public string Code { get; set; }
        public double Money { get; set; }
    }

 public class UnifiedOrderResultDto
    {
        public string appId { get; set; }
        public string prepayId { get; set; }
    }

4 通过统一下单可以获取到预支付id(prepayId),通过ABP.WECHAT的原生接口/wechatpay/wechat-pay/js-sdk-config-parameters,获取签名及前端调起支付所需的参数

返回值:


图片.png

5 前端根据官方文档进行JSAPI调起支付

6 支付完成

所遇到的问题:

1 配置文件要匹配对,否则会报签名匹配失败的错误


图片.png

2 订单号,code,随机数之类的值, 每一次都必须是新的不能重复使用,会报错

3 接口和发布都得在80端口下,接口我们是读的域名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容