最近在接入支付宝和微信的app支付 , 之前因为大部分做的都是网页版的支付,没接触过app,这次把遇到的坑都记录下来。

首先 支付宝支付 https://openhome.alipay.com/platform/home.htm 先去这里 注册商户   然后就是填写一系列的资料 申请啊 什么的。  最后通过了。

登陆后  点击这个 

  然后    这样 就创建了 一个app支付的应用

——————

 这个是你创建好的app  里面有我们需要的信息

这地方 我们需要修改

1. 应用网关 :修改为你服务器的ip或者域名  

2. 授权回调地址  修改为 : 你自己写好的 处理支付宝支付成功后的 业务逻辑 (@RequestMapping) 地址 

3. RSA 密钥  :你自己生成的 应用公钥  上传后 会得到  支付宝公钥  (回调时候需要 支付宝公钥 才可以获得支付宝传回来的参数)   (支付宝密钥生成 https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.Rju6nj&treeId=291&articleId=105971&docType=1)


4. 通过 密钥生成工具 得到  商户私钥  一定要保存好 后面签名的时候需要  而且要和 你自己生成的  公钥(不是支付宝的公钥 是你自己拿工具生成的)  对应 


5. appid : 上面图片里面的 你创建的应用的 id 

注意 !!!  授权回调 地址 默认为 80端口  不可以为其他端口  也就是说你本地是 不会回调的 或者 其他 比如  xx.12.34.9:8080/xx/notifyMobile  这是不行的 必须部署为 80端口


这就是 支付宝整个 签名过程 然后你把他 返回的 东西 给  ios 或者 android 就行了  就可以唤醒 手机端app 


以下是回调的代码 包括 微信和支付宝的回调 


//支付宝回调@RequestMapping(value = "/mobilePayNotify")public void alipayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {logger.info("$$$$alipayNotify进入!");try {// 获取支付宝POST过来反馈信息Map<String, String> params = new HashMap<String, String>();Map<String, String[]> requestParams = request.getParameterMap();for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {String name = iter.next();String[] values = (String[]) requestParams.get(name);String valueStr = "";for (int i = 0; i < values.length; i++) {valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";}params.put(name, valueStr);}// 买家付款账号String buyer_logon_id = params.get("buyer_logon_id");BigDecimal total_amount = new BigDecimal(params.get("total_amount"));// 商户订单号String out_trade_no = params.get("out_trade_no");// 支付宝交易号String trade_no = params.get("trade_no");// 交易状态String trade_status = params.get("trade_status");String extraParam = "";int offset = out_trade_no.indexOf("_");if(offset>-1){extraParam = out_trade_no.substring(offset+1);out_trade_no = out_trade_no.substring(0,offset);}// 获得支付信息String payKey = PayPropertySupport.getProperty("pay.ali.publicKey");if (AlipayNotify.verifyMobileNotify(params, payKey)) {// 验证成功if (trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")) {// 支付成功后执行相关业务logger.info("订单编号:"+out_trade_no+";支付金额:"+total_amount);afterPay(out_trade_no, trade_no,ConstantUtil.alipay);}} else {logger.info("$$$$alipayNotify验证失败——商户订单号:" + out_trade_no + ";支付宝交易号:" + trade_no + ",交易状态:" + trade_status);}ResponseUtils.renderText(response, "success");} catch (Exception e) {logger.info("$$$$alipayNotify业务逻辑异常:" + e.getMessage(), e);ResponseUtils.renderText(response, "fail");}}@RequestMapping("/wxMobileNotify")public void wxNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {logger.info("@@@@收到微信支付信息,进入notify流程@@@@");try {InputStream in = request.getInputStream();String s = null;BufferedReader br = new BufferedReader(new InputStreamReader(in, "utf-8"));StringBuffer sb = new StringBuffer();while ((s = br.readLine()) != null) {sb.append(s);}br.close();in.close();Map<String, String> params = XMLUtil.doXMLParse(sb.toString());SortedMap<String, String> newParams = new TreeMap<String, String>(params);newParams.put("key", ConstantUtil.APP_KEY);String out_trade_no = (String) params.get("out_trade_no");String trade_no = (String) params.get("transaction_id");// 总金额,分String total = (String) params.get("total_fee");String respCode = (String) params.get("result_code");String openId = (String) params.get("openid");// 自定义参数String extraParam = (String) params.get("attach");if (WxPrepay.isValiSign(newParams)) {logger.info("@@@@验证成功@@@@");if (respCode != null && respCode.equals("SUCCESS")) {//支付成功后 业务逻辑 afterPay(out_trade_no, trade_no,ConstantUtil.wxpay);} else {logger.info("@@@@支付交易状态未知——订单号:" + out_trade_no + ";交易状态:" + respCode + ";微信支付订单号:" + trade_no);}} else {logger.info("@@@@验证失败@@@@");}} catch (Exception e) {logger.info("@@@@支付后业务逻辑异常" + e.getMessage() + "@@@@");}}public void afterPay(String out_trade_no,String trade_no,String payMethod){OrderPayExample example = new OrderPayExample();example.createCriteria().andOrderNoEqualTo(out_trade_no);List<OrderPay> list = orderPayService.selectByExample(example);//设置 单个订单状态for (OrderPay orderPay : list) {Order order = orderService.selectByPrimaryKey(orderPay.getOrderId());order.setStatus(1);order.setRemark(trade_no);order.setPayMethod(payMethod);orderService.updateByPrimaryKeySelective(order);}//设置 购物车订单状态for (OrderPay orderPay : list) {orderPay.setStates(1);orderPayService.updateByPrimaryKeySelective(orderPay);} }
}

可以根据自己要求 的修改  切记 支付宝的回调 如果要获取 支付相关信息 必须用 支付宝的公钥  (不是自己生成的)


——————


微信  去这 https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN 申请 并且签约 app支付  (支付宝也是要签约的 )


  public static Map wxAppPrepareId(BigDecimal price, String orderId, String info, String ip){SortedMap<String, String> params =new TreeMap();params.put("body", info); params.put("nonce_str", WXUtil.getNonceStr());params.put("out_trade_no", orderId);params.put("total_fee", String.valueOf(price.multiply(new BigDecimal(100)).intValue()));params.put("spbill_create_ip", "8.8.8.8");params.put("notify_url", ConstantUtil.BACK_URL);params.put("trade_type", "APP");params.put("mch_id", ConstantUtil.PARTNER);params.put("appid", ConstantUtil.APP_ID);params.put("key", ConstantUtil.APP_KEY);params.put("sign", createSign(params));SortedMap<String,String> map =  new TreeMap();Map mapStr = getPrepayApp(params);map.put("key", ConstantUtil.APP_KEY);map.put("timestamp",  WXUtil.getTimeStamp());map.put("package","Sign=WXPay");map.put("noncestr", (String)mapStr.get("nonce_str"));map.put("partnerid", ConstantUtil.PARTNER);map.put("appid", ConstantUtil.APP_ID);map.put("prepayid",(String)mapStr.get("prepay_id"));map.put("sign",createSign(map));return map;}

微信需要   其实还有 api_key  那 个需要在 商户平台去设置  是在签名的时候使用的  


大致 到这里 就都ok了  


其实主要还是 拼接字符串 签名的时候会出现问题 一旦你拼错一点点  就会出现各种问题  不唤醒app 等 。 代码大概贴出来了  更多资料 去 格子的 官网查看 api    


Mark 一下 防止自己忘记   =。= 

  


java支付宝和微信app支付(服务端处理)相关推荐

  1. 微信app支付服务端开发记录

    微信APP支付服务端 调用接口需要注意事项: 1.签名:需要全部参数参加签名,空值去掉.(实际传递了什么参数需要,就根据实际参数进行签名) 2.签名参数:appid是申请支付功能的app对于的ID,k ...

  2. 微信APP支付服务端和Android 端详解及其demo

    最近在开发APP微信支付和支付宝支付,Android 端和后端都是我自己开发的,发现两家公司的文档都不是很友好,特别是微信,接触过或者开发过的人都应该有所体会.因此我特意把开发的过程梳理了,做下记录, ...

  3. 微信APP支付服务端PHP完整代码

    <?php//微信APP支付 一定要先仔细阅读微信的官方文档,统一下单接口 // 调取微信APP支付必须先开通商户后台的微信APP支付 // 注意:开通微信APP支付会发邮件到你们邮箱,下面的商 ...

  4. 微信app服务端php,微信APP支付服务端PHP完整代码

    //微信APP支付 一定要先仔细阅读微信的官方文档,统一下单接口 // 调取微信APP支付必须先开通商户后台的微信APP支付 // 注意:开通微信APP支付会发邮件到你们邮箱,下面的商户号和appid ...

  5. 微信APP支付服务端demo

    1.创建应用(获取appid) 要开发APP微信支付,需要在微信开放平台(http://open.weixin.qq.com)上创建应用以获得应用id.微信有几个平台,一定要搞清楚,否则开发过程会觉得 ...

  6. java微信app支付服务端v3代码

    微信的文档写的是真的烂,特别是刚写完支付宝和苹果支付,有了对比就显得微信的文档是真的垃圾,想体验的可以去看下: 微信官方文档 为了下次做微信支付的时候能舒服点,记录下 主要坑点 统一下单接口调用的时候 ...

  7. php微信生成签名_微信APP支付服务端PHP生成签名

    官网支付说明 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择商品,提交订单,选择微信支付. 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口.参见[统一下单API]. 步 ...

  8. 解决微信App支付服务端,App上提示“商户支付下单id非法”

    折腾了半天,请大家一定要注意 统一下单接口,返回的字段名是"prepay_id" 调起支付接口,传入的字段名是"prepayid" 坑爹的微信支付!! 同时呼吁 ...

  9. java app支付_Java 微信支付之APP支付服务端 (一)

    Java 微信支付之APP支付服务端 (一) 如图所示,这是服务端要集成的所有微信接口.至于在开放平台申请就不做赘述了.主要流程,1.下单,2.异步通知,3.查询. 一.微信统一下单请求交易 /** ...

最新文章

  1. Apache Beam和BigQuery的错误处理(Java SDK)
  2. windows的php如何安装目录结构,禅道的目录结构
  3. C++构造函数调用规则
  4. 经典文章解释apache与tomcat!看完秒懂
  5. 设计模式在Netty中的应用-工厂模式源码举例
  6. VMware 安装LINUX系统(一)
  7. TP5的安装部署概要
  8. 设置表格表头字体_Excel双栏和三栏斜线表头制作技巧
  9. Chrome 开发者工具网络性能使用
  10. 10种软件滤波方法的示例程序
  11. 游戏帐号被盗,但是杀毒软件没有发现病毒?DNS挟持盗号原理剖析
  12. 在RHEL6上针对rm命令做审计
  13. WhatsApp选择了便利而不是隐私,这是解决问题的方法
  14. python爬不同图片分别保存在不同文件夹中
  15. 【Numpy】np.stack()最通俗易懂解释
  16. win10如何共享打印机_局域网内,办公室USB接口打印机如何共享
  17. ARM MIPS PowerPC X86 四大常见处理架构比较
  18. 文件系统错误(-1073740791)解决办法
  19. ubantu下载SSH,使用butty连接自己Windows10和uabntu虚拟机
  20. 打印机连接正常打印没反应 打印机连接正常但没反应怎么回事?

热门文章

  1. 20170601メモbaijiahao
  2. 基于Spring包扫描工具和MybatisPlus逆向工程组件的数据表自动同步机制
  3. 机器翻译及其技术实现
  4. 华为手机网上邻居,在连接电脑共享时 总是提示连接失败,解决方法 一步到位
  5. wireshark抓虚拟网卡_抓取Vmware虚拟网卡上的网络数据包
  6. OkHttp的运用与原理(cookie、缓存、源码解析)
  7. 真的吗真的吗真的吗真的吗
  8. 更相减损法 php,求两数最大公约数 - WAITING520的个人空间 - OSCHINA - 中文开源技术交流社区...
  9. mac快速上手使用指南
  10. linux sort uniq -c