微信公众号支付开发全过程

需求:把游戏里的商城转移到微信公众号上

微信公众号支付开发的准备过程:

需要注册一个公众号,然后开通微信支付功能(需要5个工作日左右),然后就可以得到APPID,APP_SECRET,商户号,商户key等参数。

开始开发:

1. 调用统一下单接口,获取预支付ID

/*** 用户提交支付,获取微信支付订单接口*/
@RequestMapping(value="/pay")
public ModelAndView pay(HttpServletRequest request,HttpServletResponse response){ModelAndView mv = new ModelAndView();String GZHID = "wxfd7c065eee11112222";// 微信公众号idString GZHSecret = "b5b3a627f5d1f8888888888888";// 微信公众号密钥idString SHHID = "111111111";// 财付通商户号String SHHKEY = "mmmmmmmmmmmmmmm";// 商户号对应的密钥/*------1.获取参数信息------- *///商户订单号String out_trade_no= request.getParameter("state"); //价格String money = request.getParameter("money");//金额转化为分为单位String finalmoney = WeChat.getMoney(money);//获取用户的codeString code = request.getParameter("code");/*------2.根据code获取微信用户的openId和access_token------- *///注: 如果后台程序之前已经得到了用户的openId 可以不需要这一步,直接从存放openId的位置或session中获取就可以。//toPay.jsp页面中提交的url路径也就不需要再经过微信重定向。写成:http://localhost:8080/项目名/wechat/pay?money=${sumPrice}&state=${orderId}String openid=null;try {List<Object> list = accessToken(code);openid=list.get(1).toString();} catch (IOException e) {logger.error("根据code获取微信用户的openId出现错误", e);mv.setViewName("error");return mv;}/*------3.生成预支付订单需要的的package数据------- *///随机数 String nonce_str= MD5.getMessageDigest(String.valueOf(new Random().nextInt(10000)).getBytes());//订单生成的机器 IPString spbill_create_ip = request.getRemoteAddr();//交易类型 :jsapi代表微信公众号支付String trade_type = "JSAPI";//这里notify_url是 微信处理完支付后的回调的应用系统接口url。String notify_url ="http://69a6a38e.ngrok.natapp.cn/heyi-console/wechat/weixinNotify";SortedMap<String, String> packageParams = new TreeMap<String, String>();packageParams.put("appid",  GZHID);  packageParams.put("mch_id",  SHHID);  packageParams.put("nonce_str", nonce_str);  packageParams.put("body", "费用");  packageParams.put("out_trade_no", out_trade_no);  packageParams.put("total_fee", finalmoney);  packageParams.put("spbill_create_ip", spbill_create_ip);  packageParams.put("notify_url", notify_url);  packageParams.put("trade_type", trade_type); packageParams.put("openid", openid); /*------4.根据package数据生成预支付订单号的签名sign------- */RequestHandler reqHandler = new RequestHandler(request, response);reqHandler.init( GZHID,  GZHSecret,  SHHKEY);String sign = reqHandler.createSign(packageParams);/*------5.生成需要提交给统一支付接口https://api.mch.weixin.qq.com/pay/unifiedorder 的xml数据-------*/String xml="<xml>"+"<appid>"+ GZHID+"</appid>"+"<mch_id>"+ SHHID+"</mch_id>"+"<nonce_str>"+nonce_str+"</nonce_str>"+"<sign>"+sign+"</sign>"+"<body><![CDATA["+"费用"+"]]></body>"+"<out_trade_no>"+out_trade_no+"</out_trade_no>"+"<total_fee>"+finalmoney+"</total_fee>"+"<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>"+"<notify_url>"+notify_url+"</notify_url>"+"<trade_type>"+trade_type+"</trade_type>"+"<openid>"+openid+"</openid>"+"</xml>";/*------6.调用统一支付接口https://api.mch.weixin.qq.com/pay/unifiedorder 生产预支付订单----------*/String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";String prepay_id="";try {prepay_id = GetWxOrderno.getPayNo(createOrderURL, xml);if(prepay_id.equals("")){mv.addObject("ErrorMsg", "支付错误");mv.setViewName("error");return mv;}} catch (Exception e) {logger.error("统一支付接口获取预支付订单出错", e);mv.setViewName("error");return mv;}/*将prepay_id存到库中*/PageData p = new PageData();p.put("shopId", out_trade_no);p.put("prePayId", prepay_id);activityService.updatePrePayId(p);/*------7.将预支付订单的id和其他信息生成签名并一起返回到jsp页面 ------- */nonce_str= MD5.getMessageDigest(String.valueOf(new Random().nextInt(10000)).getBytes());SortedMap<String, String> finalpackage = new TreeMap<String, String>();String timestamp = String.valueOf(System.currentTimeMillis() / 1000);String packages = "prepay_id="+prepay_id;finalpackage.put("appId",  GZHID);  finalpackage.put("timeStamp", timestamp);  finalpackage.put("nonceStr", nonce_str);  finalpackage.put("package", packages);  finalpackage.put("signType", "MD5");String finalsign = reqHandler.createSign(finalpackage);mv.addObject("appid",  GZHID);mv.addObject("timeStamp", timestamp);mv.addObject("nonceStr", nonce_str);mv.addObject("packageValue", packages);mv.addObject("paySign", finalsign);mv.addObject("success","ok");mv.setViewName("wechat/pay");return mv;
}

2. H5调起微信支付的内置JS

<script type="text/javascript">function onBridgeReady(){WeixinJSBridge.invoke('getBrandWCPayRequest', {"appId" : "<%=paramsMap.get("appId") %>",     //公众号名称,由商户传入     "timeStamp":"<%=paramsMap.get("timeStamp") %>",         //时间戳,自1970年以来的秒数     "nonceStr" : "<%=paramsMap.get("nonceStr")%>", //随机串     "package" : "<%=paramsMap.get("package")%>",     "signType" : "<%=paramsMap.get("signType")%>",         //微信签名方式:     "paySign" : "<%=paramsMap.get("paySign")%>" //微信签名 },function(res){    // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 if(res.err_msg == "get_brand_wcpay_request:ok" ) {//成功$("#tip_icon").addClass("weui_icon_success");$("#tip").text("购买成功");$("#amount").text("恭喜你,获得"+"<%=goodContent%>");}else if(res.err_msg == "get_brand_wcpay_request:cancel" ) {//取消$("#tip_icon").addClass("weui_icon_warn");$("#tip").text("用户取消支付");}else if(res.err_msg == "get_brand_wcpay_request:fail" ) {//失败$("#tip_icon").addClass("weui_icon_warn");$("#tip").text("支付失败");}else{$("#tip").text(res.err_msg);}$(".confirm_container").show();$("#chargeBtn").show();}); }if (typeof WeixinJSBridge == "undefined"){if( document.addEventListener ){document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);}else if (document.attachEvent){document.attachEvent('WeixinJSBridgeReady', onBridgeReady); document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);}}else{onBridgeReady();}</script>

3.支付成功之后跳转回自己的系统的某个页面

遇到的问题:

1.在微信商户平台里面需要设置api秘钥(paternerKey),所谓paternerKey意思就是伙伴的秘钥,也就是合作商的秘钥。

需要自定义一个字符串,然后用MD5加密成32位的字符串,然后设置。

2.统一下单接口的容易出错的参数:

1)trade_type==交易类型==取值如下:JSAPI,NATIVE,APP。我们这里使用的JSAPI。标题已经说了,是微信公众号支付。他们的区别,请参考https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_2。

ps:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付,统一下单接口trade_type的传参可参考这里。MICROPAY--刷卡支付,刷卡支付有单独的支付接口,不调用统一下单接口。

2)notify_url==通知地址==接收微信支付异步通知回调地址,通知url必须为直接可访问的url,不能携带参数。

3)sign==签名==官方给的签名算法。https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3。获取预支付ID时,如果返回值是【签名错误】。那真是的你的签名错了,请仔细核对生成sign的参数名称、参数值和调用统一下单接口的参数名称和参数值

3.要想支付成功,需要在商户号设置支付授权目录。路径应为支付页面的上一级路径。

======================================大功告成=============================================

微信公众号支付开发全过程相关推荐

  1. 微信公众号支付开发全过程(java版)

    文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源. 一.微信官方文档微信支付开发流程(公众号支付) 首先我们到微信支付的官方文档的开发步骤部分查 ...

  2. 公众号支付demo java_微信公众号支付开发全过程(java版)

    文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源. 一.微信官方文档微信支付开发流程(公众号支付) 首先我们到微信支付的官方文档的开发步骤部分查 ...

  3. 微信公众号支付开发手记(node)

    微信支付 前言 总结一下最近业务开发中对微信公众号支付的开发过程,微信支付的开发前提是已经具备可上线微信公众号开发的基础上进行的,如果你的开发阶段目前停留在起步,建议参考这篇文章开始. 好了,来聊一聊 ...

  4. 微信公众号支付开发步骤Java(超详细)

    做为一个刚刚做完微信公众号的小白,我不得不吐槽一下微信给的官方文档,里面那坑一个接一个,我这是跳进去再爬出来,一下给做了四天,本来技术就不够好,还被文档带的跑偏跑偏...我在这给大家整理一份超级详细的 ...

  5. java微信公众号支付开发平台_微信公众号支付demo,微信公众号支付Java DEMO

    1.5.4微信验证的控制方法: /** * 微信验证 * 请填写接口配置信息,此信息需要你有自己的服务器资源,填写的URL需要正确响应微信发送的Token验证 * 验证服务器地址的有效性 * 开发者提 ...

  6. java微信公众号支付开发平台_Java微信公众平台开发之公众号支付(微信内H5调起支付)...

    官方文档 准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败) 借鉴了很多大神的文章,在此先谢过了 整个支付流程,看懂就很好写了 一.设置支付目录 在微信公众平台设置您的公众号 ...

  7. 微信公众号支付开发 --Java

    公众号支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有: ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付 ...

  8. 微信公众号支付开发(一):前期准备

    微信公众号认证(服务号认证) 说明:如果没有发布文章的需建议认证服务号,如果每个自然月每天都要发文章认证订阅号,这里是认证服务号. 准备工作: 注册一个新邮箱. 1. 注册微信公众号账号:注册一个微信 ...

  9. 关于微信学习之微信公众号支付开发

    关于微信支付初学者一定有很多的疑问,首先我们需要结合一下自己的程序操作微信支付所需要的业务流程. 1.如我这边需要开发一个公众号支付: 首先用户扫码访问后台(或者通过公众号直接进入,点击一个支付请求按 ...

  10. 微信公众号支付开发配置

    一.微信公众平台配置 登陆微信公众平台 微信支付->开发配置 1.测试白名单:把自己的微信号加上 2.测试授权目录:修改为项目所属域名,不加端口号.例如:http://d****n.g**.ne ...

最新文章

  1. numpy.where用法
  2. BCE支持者在BCH见面会烧毁BCH主题衣服
  3. 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?
  4. MTK MtkSettings Sim Dialog Patch
  5. P2473-[SCOI2008]奖励关【数学期望,状压dp】
  6. gtone eclipse plugin install
  7. java 语法 —— 数组
  8. ABP源码分析四十七:ABP中的异常处理
  9. 苹果版App开发心得
  10. github的学习和使用
  11. Android模拟器SDL_app:emulator.exe 解决方法
  12. target sum java_LeetCode 494. Target Sum
  13. ZOJ 1060 Count the Color
  14. 淘宝电商PRD文档模板讲解
  15. 台达PLC实现伺服电机的正反转
  16. html求相关系数,相关系数,确定系数(R^2)计算公式与在线计算器_三贝计算网_23bei.com...
  17. Python解线性方程组的直接法(5)————平方根法求解线性方程组
  18. java打字小游戏_java实现打字游戏小程序
  19. HCIP-Datacom 分解实验1:访问控制列表
  20. 【工程实践】jsonlines 读取多行数据

热门文章

  1. PHP100视频解压密码以及目录
  2. 自制试题(逻辑思维训练500题)
  3. 动态版简易通讯录制作
  4. android打开wav声音
  5. 关于visual studio 2005的中文版下载(最新详细下载点)
  6. java之beanutils技术
  7. 如何给windows 98虚拟机安装声卡驱动 - PCI Multimedia Audio Device
  8. 《计算机操作系统(慕课版)》(汤小丹著)课后习题答案
  9. htc x920e刷android7.0,HTC X920e(Butterfly)第三方recovery刷入教程
  10. 3d之家开机号计算机网,3d之家最新开机号