java微信公众号支付详细源码和具体流程 200C

java新人,现需要做微信公众号支付开发,提供的sdk文档只看懂大概,感谢各大神帮助

2个回答

我给你推荐一个详细的教程链接:http://blog.csdn.net/lyq8479/article/details/9841371
这个是微信号公众号开发教程,你可以看一下

很简单吧。公众号调用微信支付只需要生成签名就行了,sdk直接调用生成就行了

主要是通知那块要自己加上逻辑,ResultNotify那个类里面增加,不懂java。。。最近弄了2个微信支付和支付宝的,下面是微信支付通知类处理的,大概逻辑如下,代码是C#的,自己参考下

         public override void ProcessNotify()
        {
            string cType = this.GetType().ToString();
            notifyData = GetNotifyData();
            //检查支付结果中transaction_id是否存在
            if (!notifyData.IsSet("transaction_id"))
            {
                //若transaction_id不存在,则立即返回结果给微信支付后台
                WxExtMethod.SendResponse("FAIL", "支付结果中微信订单号不存在", LogFunc.Error, cType, "The Pay result is error : " + notifyData.ToXml());
            }
            //校验通过商户订单是否存在
            string out_trade_no = notifyData.GetValue("out_trade_no").ToString();//需要32位长度
            string transaction_id = notifyData.GetValue("transaction_id").ToString();//微信订单


            //读数据库校验商户订单号是否存在,并且获取对应的微信订单号,如果已经存在不需要再查询
            string sql = "select o.tradeno,o.totalpay,o.eatdate,o.eattime,t.no,u.wxid from orders o"
                +" left join tableno t on t.info_id=o.tableid"
                +" left join users u on u.info_id=o.sendby"
                +" where o.orderno='" + out_trade_no + "'";

            DBHelper db = new DBHelper();
            DataTable dt = db.FillDataTable(sql);

            if (dt.Rows.Count == 0) //商户订单不存在
            {               
                WxExtMethod.SendResponse("FAIL", "内部订单不存在或者已经支付", LogFunc.Error, cType, "内部订单不存在或者已经支付【" + sql + "】",db);
            }
            else if (dt.Rows[0][0].ToString() == transaction_id)//订单支付过,重复通知直接返回成功
            {
                WxExtMethod.SendResponse("SUCCESS", "OK", LogFunc.Info, cType, "商户订单已经成功支付过",db);
            }
            string eatdate = dt.Rows[0]["eatdate"].ToString(), eattime = dt.Rows[0]["eattime"].ToString()
                , no = dt.Rows[0]["no"].ToString(), wxid = dt.Rows[0]["wxid"].ToString(), msttotalpay = dt.Rows[0][1].ToString();
            string totalpay = ((int)(float.Parse(msttotalpay) * 100)).ToString();
            dt.Dispose();
            //未支付过,查询订单信息,并判断是否成功,失败直接
            if (QueryOrder(transaction_id))
            {
                //检查订单总额是否一致
                if (orderData.GetValue("total_fee").ToString() == totalpay)
                {
                    //更新订单状态,支付详情
                    sql = "update orders set tradeno='" + Format.Sql(transaction_id) + "',payrst='" + Format.Sql(orderData.ToJson()) + "',state=1 where orderno='" + out_trade_no + "'";
                    try
                    {
                        db.ExecuteNonQuery(sql);
                        db.CloseDB();
                        //发送微信客服信息
                        if(!string.IsNullOrEmpty(SiteConfig.wxMsgOrderSuccess))WeixinEvents.SendMessage(context,
                            SiteConfig.wxMsgOrderSuccess.Replace("{orderno}", out_trade_no).Replace("{pay}", msttotalpay).Replace("{time}", eatdate + (eattime == "1" ? "午餐" : "晚餐")).Replace("{no}", no)
                            , wxid);
                        WxExtMethod.SendResponse("SUCCESS", "OK", LogFunc.Info, cType, "成功支付并且更新数据库订单信息");
                    }
                    catch
                    {
                        WxExtMethod.SendResponse("FAIL", "更新订单状态信息失败", LogFunc.Error, cType, "更新订单状态信息失败【" + sql + "】", db);
                    }
                }
                else
                {
                    WxExtMethod.SendResponse("FAIL", "金额不一致", LogFunc.Error, cType,
                         "金额(单位元)不一致,订单“" + totalpay + "”,返回“" + orderData.GetValue("total_fee").ToString() + "”", db);
                }
            }
            else
            {//查询失败
                WxExtMethod.SendResponse("FAIL", "订单查询失败", LogFunc.Error, cType, "Order query failure : " + orderData.ToXml(), db);
            }

        }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问