微信支付出现的问题总结--不同域名进行授权解决方案

1、如果使用的是微信支付的方式,并且使用的是native的支付方式,那么需要在服务器上生成一张二维码,注意二维码的路径问题:

  1. String imgName = UUID.randomUUID().toString().replace("-", "") +".png";
  2. String QRPath = this.getServletContext().getRealPath("/pay/QRIMG/wx") + imgName;

使用上述的方式可以解决路径问题;在项目中直接引用该文件就可以了

2、在多个项目中,由于微信的授权登陆只能配置一个,如下图(不同域名进行授权解决方案):

此时我们想获得到微信授权到不同的域名,此时的方法为:

这里贴出2个主要的授权方法:

解析方法;

  1. package com.huawei.nser.wap.wxtransformation;
  2. import java.util.Enumeration;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.UUID;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.apache.struts.action.Action;
  9. import org.apache.struts.action.ActionForm;
  10. import org.apache.struts.action.ActionForward;
  11. import org.apache.struts.action.ActionMapping;
  12. import org.jfree.util.Log;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import com.huawei.nser.pub.SJBUtil;
  16. import com.huawei.nser.wap.wxtransformation.model.TransfmMessageBean;
  17. import com.huawei.nser.wap.wxtransformation.service.TransfmMessageService;
  18. /**
  19. *
  20. * @author 获取微信id并跳转
  21. *
  22. */
  23. public class WapTransWXAction extends Action{
  24. private Logger log = LoggerFactory.getLogger(WapTransWXAction.class);
  25. private TransfmMessageService transfmMessageService ;
  26. @Override
  27. public ActionForward execute(ActionMapping mapping, ActionForm form,
  28. HttpServletRequest request, HttpServletResponse response) throws Exception {
  29. log.info("@@@@@ WapTransWXAction.execute enter this method");
  30. transfmMessageService = (TransfmMessageService) SJBUtil.getBean("transfmMessage");
  31. //获取信息并保持内容
  32. String id = UUID.randomUUID().toString().replace("-", "");
  33. String field1 = request.getParameter("field1");
  34. String field2 = request.getParameter("field2");
  35. String field3 = request.getParameter("field3");
  36. String call_back_url = request.getParameter("callBackUrl");
  37. TransfmMessageBean transfmMessageBean = new TransfmMessageBean();
  38. transfmMessageBean.setId(id);
  39. transfmMessageBean.setField1(field1);
  40. transfmMessageBean.setField2(field2);
  41. transfmMessageBean.setField3(field3);
  42. transfmMessageBean.setCall_back_url(call_back_url);
  43. //step1 保存转换信息
  44. transfmMessageService.saveTransFmMessage(transfmMessageBean);
  45. String authorizeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4b19bad466392998&redirect_uri=http://babyhhcsy.imwork.net/wapnew/ngwap/weixinopenid.do?id="+id+"&response_type=code&scope=snsapi_base&state=1#wechat_redirect";
  46. log.info("@@@@@ WapTransWXAction.execute get authorizeurl is :{}",authorizeUrl);
  47. //step 3 调取微信;
  48. response.sendRedirect(authorizeUrl);
  49. return null;
  50. }
  51. public Map<String, String> request2Map(HttpServletRequest request) {
  52. Map<String, String> map = new HashMap<String, String>();
  53. Enumeration<String> names = request.getParameterNames();
  54. while (names.hasMoreElements()) {
  55. String key = names.nextElement();
  56. String value = request.getParameter(key);
  57. if (value == null || value.trim().equals("")) {
  58. continue;
  59. }
  60. map.put(key, value);
  61. }
  62. return map;
  63. }
  64. public String map2String(Map<String,String> map){
  65. StringBuffer sb = new StringBuffer();
  66. for (Map.Entry<String, String> entry : map.entrySet()) {
  67. sb.append(entry.getKey()+"="+entry.getValue()+";");
  68. }
  69. Log.info(sb.toString());
  70. return sb.toString();
  71. }
  72. public TransfmMessageService getTransfmMessageService() {
  73. return transfmMessageService;
  74. }
  75. public void setTransfmMessageService(TransfmMessageService transfmMessageService) {
  76. this.transfmMessageService = transfmMessageService;
  77. }
  78. }

解析方法:

  1. package com.huawei.nser.wap.wxtransformation;
  2. import java.io.IOException;
  3. import java.util.Enumeration;
  4. import java.util.HashMap;
  5. import java.util.Map;
  6. import javax.servlet.ServletException;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import net.sf.json.JSONObject;
  10. import org.apache.commons.lang.StringUtils;
  11. import org.apache.struts.action.Action;
  12. import org.apache.struts.action.ActionForm;
  13. import org.apache.struts.action.ActionForward;
  14. import org.apache.struts.action.ActionMapping;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import com.huawei.nser.pub.SJBUtil;
  18. import com.huawei.nser.wap.bankPay.util.HttpsRequestUtil;
  19. import com.huawei.nser.wap.wxtransformation.model.TransfmMessageBean;
  20. import com.huawei.nser.wap.wxtransformation.service.TransfmMessageService;
  21. /**
  22. * 微信转换类,获得code内容
  23. * @author thero
  24. *
  25. */
  26. public class WXTransAction extends Action {
  27. private Logger log = LoggerFactory.getLogger(WapTransWXAction.class);
  28. private static final String code2openId = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=myappid&secret=mysecret&code=mycode&grant_type=authorization_code";
  29. private static final long serialVersionUID = 1L;
  30. @Override
  31. public ActionForward execute(ActionMapping mapping, ActionForm form,
  32. HttpServletRequest request, HttpServletResponse response) throws Exception {
  33. String code = request.getParameter("code");
  34. log.info("AuthorizeUserServlet.doPost get code is :{},get paramter is {}",code,request.getQueryString());
  35. //step 1 获得id ;
  36. String id = request.getParameter("id");
  37. log.info("@@@@@ get url from wx is :{},and id is",request.getRequestURL(),id);
  38. //step 2 从数据库查询id并获得url;
  39. TransfmMessageService transfmMessageService = (TransfmMessageService) SJBUtil.getBean("transfmMessage");
  40. TransfmMessageBean dbtransfmMessage = transfmMessageService.querytransfmMessage(id);
  41. if(dbtransfmMessage!=null){
  42. String call_back_url = dbtransfmMessage.getCall_back_url();
  43. String openid = this.code2OpenId(request, code, response);
  44. dbtransfmMessage.setOpenid(openid);
  45. transfmMessageService.saveTransFmMessage2(dbtransfmMessage);
  46. StringBuffer sb = new StringBuffer();
  47. sb.append(call_back_url);
  48. sb.append("?openid="+openid);
  49. if(null!=dbtransfmMessage.getField1()&& !"".equals(dbtransfmMessage.getField1())){
  50. sb.append("&fields1="+dbtransfmMessage.getField1());
  51. }
  52. if(null!=dbtransfmMessage.getField2()&& !"".equals(dbtransfmMessage.getField2())){
  53. sb.append("&fields2="+dbtransfmMessage.getField2());
  54. }
  55. if(null!=dbtransfmMessage.getField3()&& !"".equals(dbtransfmMessage.getField3())){
  56. sb.append("&fields3="+dbtransfmMessage.getField3());
  57. }
  58. response.sendRedirect(sb.toString());
  59. return null;
  60. }
  61. return null;
  62. }
  63. public String code2OpenId(HttpServletRequest request,String code, HttpServletResponse response) throws ServletException, IOException{
  64. String openId = null;
  65. String tempUrl = code2openId.replace("myappid", "wxXXXXX8").replace("mysecret", "13XXXXXXc66").replace("mycode",code);
  66. //String tempUrl = code2openId.replace("myappid", "wXXXXXf").replace("mysecret", "7aXXXXXc28").replace("mycode",code);
  67. log.info("AuthorizeUserServlet.code2OpenId get tempUrl is :{}",tempUrl);
  68. JSONObject result = HttpsRequestUtil.httpsRequest(tempUrl, HttpsRequestUtil.POST,"");
  69. log.info("AuthorizeUserServlet.code2OpenId get openid is :{}",result.toString());
  70. if(!(null!=result && result.get("openid")!=null)){
  71. return null;
  72. }else{
  73. return result.get("openid").toString();
  74. }
  75. }
  76. public Map<String, String> request2Map(HttpServletRequest request) {
  77. Map<String, String> map = new HashMap<String, String>();
  78. Enumeration<String> names = request.getParameterNames();
  79. while (names.hasMoreElements()) {
  80. String key = names.nextElement();
  81. String value = request.getParameter(key);
  82. if (value == null || value.trim().equals("")) {
  83. continue;
  84. }
  85. map.put(key, value);
  86. }
  87. return map;
  88. }
  89. public String map2String(Map<String, String> map) {
  90. StringBuffer sb = new StringBuffer();
  91. for (Map.Entry<String, String> entry : map.entrySet()) {
  92. sb.append(entry.getKey() + "=" + entry.getValue() + ";");
  93. }
  94. log.info(sb.toString());
  95. return sb.toString();
  96. }
  97. }

数据库脚本:

  1. prompt PL/SQL Developer import file
  2. prompt Created on 2015年7月17日 星期五 by wangjirong
  3. set feedback off
  4. set define off
  5. prompt Creating EC_GET_OPEN_ID...
  6. create table EC_GET_OPEN_ID
  7. (
  8. id VARCHAR2(32) not null,
  9. call_back_url VARCHAR2(300),
  10. openid VARCHAR2(28),
  11. session_id VARCHAR2(24),
  12. field1 VARCHAR2(30),
  13. field2 VARCHAR2(30),
  14. field3 VARCHAR2(30)
  15. )
  16. tablespace ECARE
  17. pctfree 10
  18. initrans 20
  19. maxtrans 255
  20. storage
  21. (
  22. initial 1M
  23. next 2M
  24. minextents 1
  25. maxextents unlimited
  26. );
  27. comment on table EC_GET_OPEN_ID
  28. is ‘微信统一获得openid数据库‘;
  29. comment on column EC_GET_OPEN_ID.id
  30. is ‘id主键‘;
  31. comment on column EC_GET_OPEN_ID.call_back_url
  32. is ‘回调url地址‘;
  33. comment on column EC_GET_OPEN_ID.openid
  34. is ‘openid微信‘;
  35. comment on column EC_GET_OPEN_ID.session_id
  36. is ‘请求session位置‘;
  37. comment on column EC_GET_OPEN_ID.field1
  38. is ‘备用字段1‘;
  39. comment on column EC_GET_OPEN_ID.field2
  40. is ‘备用字段2‘;
  41. comment on column EC_GET_OPEN_ID.field3
  42. is ‘备用字段3‘;
  43. alter table EC_GET_OPEN_ID
  44. add constraint PK primary key (ID)
  45. using index
  46. tablespace ECARE
  47. pctfree 10
  48. initrans 2
  49. maxtrans 255
  50. storage
  51. (
  52. initial 64K
  53. next 1M
  54. minextents 1
  55. maxextents unlimited
  56. );
  57. prompt Disabling triggers for EC_GET_OPEN_ID...
  58. alter table EC_GET_OPEN_ID disable all triggers;
  59. prompt Loading EC_GET_OPEN_ID...
  60. insert into EC_GET_OPEN_ID (id, call_back_url, openid, session_id, field1, field2, field3)
  61. values (‘121‘, ‘http://192.168.88.210:8071/weixin/pay/pay.jsp‘, ‘oznhbuPT3DkbBHmZCWbU4Gr4cbjw‘, null, ‘123‘, ‘321‘, null);
  62. insert into EC_GET_OPEN_ID (id, call_back_url, openid, session_id, field1, field2, field3)
  63. values (‘feb0aaed1cda4c868b569bb2c6202a68‘, ‘http://192.168.88.210:8071/weixin/pay/pay.jsp‘, null, null, ‘123‘, ‘321‘, null);
  64. insert into EC_GET_OPEN_ID (id, call_back_url, openid, session_id, field1, field2, field3)
  65. values (‘078ed17fb5f14665af5c5abef8570bf9‘, ‘http://192.168.88.210:8071/weixin/pay/pay.jsp‘, null, null, ‘123‘, ‘321‘, null);
  66. insert into EC_GET_OPEN_ID (id, call_back_url, openid, session_id, field1, field2, field3)
  67. values (‘020e9039d75d4ea88b9a8e79e8310bc5‘, ‘http://192.168.88.210:8071/weixin/pay/pay.jsp‘, null, null, ‘123‘, ‘321‘, null);
  68. insert into EC_GET_OPEN_ID (id, call_back_url, openid, session_id, field1, field2, field3)
  69. values (‘65a063d899e44349a906d652228d7759‘, ‘http://192.168.88.210:8071/weixin/pay/pay.jsp‘, null, null, ‘123‘, ‘321‘, null);
  70. insert into EC_GET_OPEN_ID (id, call_back_url, openid, session_id, field1, field2, field3)
  71. values (‘cb9e40134a3043319af8ef70fff208af‘, ‘http://192.168.88.210:8071/weixin/pay/pay.jsp‘, null, null, ‘123‘, ‘321‘, null);
  72. insert into EC_GET_OPEN_ID (id, call_back_url, openid, session_id, field1, field2, field3)
  73. values (‘a789ee91f5d749a89a20fe102f93dddb‘, ‘http://192.168.88.210:8071/weixin/pay/pay.jsp‘, null, null, ‘123‘, ‘321‘, null);
  74. commit;
  75. prompt 7 records loaded
  76. prompt Enabling triggers for EC_GET_OPEN_ID...
  77. alter table EC_GET_OPEN_ID enable all triggers;
  78. set feedback on
  79. set define on
  80. prompt Done.

3、微信openid的区别:

在开发微信的时候,如果你使用了测试账户,测试账户值得是:在公众平台设置的测试账号;测试你用过授权得到的openid,和实际使用的openid是不一致的!,需要特别的注意,在正式上线的时候,需要使用真实的openid;

使用测试账号的openid和测试的首选域,是可以完成支付测试的,需要注意:只

公众平台设置了测试授权目录才能进行相应的支付测试,负责,不能完成支付;

来自为知笔记(Wiz)

时间: 2024-10-10 17:23:15

微信支付出现的问题总结--不同域名进行授权解决方案的相关文章

微信支付配置参数:支付授权目录、回调支付URL

一.开通微信支付的首要条件是:认证服务号或政府媒体类认证订阅号(一般认证订阅号无法申请微信支付) 二.微信支付分为老版支付和新版支付,除了较早期申请的用户为老版支付,现均为新版微信支付. 三.公众平台微信支付开发配置参数: 1.支付授权目录:www.weixunyunduan.com/yunduanwx/wxpay/(主域名状态下填写此目录) 2.支付授权目录:www.weixunyunduan.com/yunduanwx/Cashier/pay/wxpay/(主域名状态下使用收银台填写此目录)

C# MVC 微信支付教程系列之公众号支付

微信支付教程系列之公众号支付   今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通过公众号里面的菜单链接,进入公众号的商城,然后在里面完成购买和支付功能,我们可以看看官方对这个公众号支付的场景的解释,链接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1,通过这个官方的解释,那我们大概清楚这个公众号的用途了,下面,我就说

华水开学第一课&amp;微信支付

由于疫情的延续,导致我们不能及时开学.只能在网上观看华水开学第一课,但是好像正常开学也没有这个哈哈(不记得了) 昨天没有玩到很晚,12点就睡下.大约半个小时睡着了.定了8点的闹钟.起来的时候那是真的困啊. 刚开始是学校的宣传片,有时候是会很卡的,大约看了30min就不再看了.然后就继续学习springboot了. 今天没有向往常那样认真的敲代码,暂停学习,可能是看多了,框架基本上熟悉了.逻辑内容看的有些不仔细. 吃完饭之后,在学校QQ群里说,B站华水直播的是正在洗手的事情,于是我就又点进去看了看

微信公开课(北京站)速记 微信、微信支付、O2O的定义与关联

本文为4月29日微信公开课(北京站)微信产品部演讲全文速记,讲述了微信官方对微信.微信支付.O2O的定义与关联等问题的看法与观点. 作者:微信产品部 刘涵涛 吴毅 去年夏天有一个全民打飞机的盛况,这实际上是微信的第一款社交类手游,它通过微信大平台的海量用户,一上线之后就有过亿的用户,甚至在淘宝上面都有代客打游戏的服务,通过这个游戏大家突然想到,微信以前是一个沟通工具,微信竟然也可以玩儿,甚至出现了这样一个段子,如果要自己的排行榜排在前面,最简单的方法是把玩这个游戏的好朋友全部踢掉. 微信红包大家

微信支付开发(1) JS API支付

关键字:微信支付 微信支付v3 jsapi支付 统一支付 Native支付 prepay_id 作者:方倍工作室 原文: http://blog.csdn.net/pondbay/article/details/40536677 本文介绍微信支付下的jsapi实现流程 前言 微信支付现在分为v2版和v3版,2014年9月10号之前申请的为v2版,之后申请的为v3版.V3版的微信支付没有paySignKey参数.v2的相关介绍请参考方倍工作室的其他文章.本文介绍的微信支付v3. 流程实现 1. O

微信支付公众号支付redirect_uri域名与后台配置不一致,错误码10003

最近弄微信支付,微信支付公众号支付redirect_uri域名与后台配置不一致,错误码10003,最容易出错两个地方 1,appid 对应不到 2,开发者网页授权 填写域名 文章来自http://www.96net.com.cn 原文地址:https://www.cnblogs.com/96net/p/9648188.html

微信支付之JSAPI公众号支付

前提 本教程默认以下几点你已经完全满足: 开通了认证后的服务号 服务号开通的微信支付的认证 腾讯给你的邮件中有商户登录的账号和密码 拥有一个可供上传代码和设置回调域名的网站或云服务 有一点点php知识. 第一步:公众号设置 1. 你的公众号,在支付认证的标签下, 内容应该和下图类似.证明公众号已经完成了认证和合约的签署. 2. 然后在微信支付–开发配置中,设置测试授权目录和测试白名单 3. 在公众号设置-功能设置标签中,设置JS接口安全域名,这个域名在认证获取token的过程中可能会用到.但具体

微信支付get_brand_wcpay_request:fail

最近做了微信支付功能,和后端一起踩坑中,微信一直报错:get_brand_wcpay_request:fail 前端js部分实现方法: 1.利用微信js sdk实现.调起微信js SDK,并注入事件chooseWXPay 2.利用内置对象 刚开始我采用第一种方法,一直报错后我采用第二种方法,发现还是报错后,我求助了度娘. 出现该问题的原因: 1.生成的sign签名有问题 2.支付授权目录配置有问题 在经过仔细的检查,后端也重新生成了签名后,这个问题还是存在.折腾了几天没有解决,发邮件咨询了微信官

H5微信支付流程

1,.在微信支付平台配置域名为支付页面的目录 比如支付页面 a.aaa.com/pay/pay.com 设置域名 a.aaa.com/pay/ 2.点击下单时候请求后台服务器,后台会去请求微信预支付订单,返回预支付订单信息res 包含appId.timeStamp.nonceStr.signType.paySign信息 3.请求微信支付 <script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></scri