参阅微信支付文档:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5


这一部分说的已经很详细了;

1.app将订单信息传给自己的后台服务;

2.后台服务接受到订单信息后,构建预支付信息,回传给APP;

接下来的过程是:

3.app获取预支付信息。调起微信支付,完成支付;

4.微信同步返回,接收通知给APP;异步调用我方后台服务提供的接口。返回成功或失败的处理结果;

贴一段别人实现的代码:

package com.epeit.api.service.wechatPay.wxpay;import com.epeit.api.annotations.FunctionCode;
import com.epeit.api.dao.ShoppingOrderMapper;
import com.epeit.api.dao.TenpayParamsMapper;
import com.epeit.api.dao.UserAddressMapper;
import com.epeit.api.dao.WxpayInfoMapper;
import com.epeit.api.dto.ApiRequest;
import com.epeit.api.dto.ApiResponse;
import com.epeit.api.enums.RestResultEnum;
import com.epeit.api.model.ShoppingOrderPo;
import com.epeit.api.model.TenpayParams;
import com.epeit.api.model.UserAddressPo;
import com.epeit.api.model.WxpayInfo;
import com.epeit.api.service.inner.CommonService;
import com.epeit.api.service.wechatPay.RequestHandler;
import com.epeit.api.service.wechatPay.client.TenpayHttpClient;
import com.epeit.api.service.wechatPay.util.Sha1Util;
import com.epeit.api.service.wechatPay.util.TenpayUtils;
import com.epeit.api.service.wechatPay.util.WxPayConfig;
import com.epeit.api.util.SerialNumberUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;/*** Created by user on 2015/3/11.*/
@FunctionCode(value = "wxPay", descript = "微信支付相关接口")
@Service
public class WxPayServiceImpl implements WxPayService {@Autowiredprivate WxpayInfoMapper wxpayInfoMapper;@Autowiredprivate TenpayParamsMapper tenpayParamsMapper;@Autowiredprivate ShoppingOrderMapper shoppingOrderMapper;@Autowiredprivate UserAddressMapper userAddressMapper;@Value("${epeit.api.server}")private String defaultApiServer;private TenpayParams tenpayParams;@FunctionCode(value = "wxPay.wxPayGoods", descript = "支付订单处理接口")@Overridepublic ApiResponse<Map<String, String>> wxPayGoods(ApiRequest apiRequest) {Object  userIdObj = apiRequest.get("userId");Object  orderCodeObj = apiRequest.get("orderCode");Object  deviceInfoObj = apiRequest.get("deviceInfo");Object  userIpObj = apiRequest.get("userIp");if (StringUtils.isEmpty(userIdObj)||StringUtils.isEmpty(orderCodeObj)) {return new ApiResponse<Map<String, String>>(RestResultEnum.MissParameterException);}ApiResponse<Map<String, String>> apiResponse =null;//支付单生成try {TenpayParams tenpayParams = this.tenpayParamsMapper.selectTenPayParamsByorderCode(orderCodeObj.toString());if(tenpayParams!=null){Map<String, String> outParams = new HashMap<String, String>();//输出参数outParams.put("retcode", "0");outParams.put("retmsg", "OK");outParams.put("appid", tenpayParams.getAppid());outParams.put("partnerid", tenpayParams.getPartnerid());outParams.put("noncestr", tenpayParams.getNoncestr());outParams.put("package", "Sign=WXPay");outParams.put("prepayid", tenpayParams.getPrepayid());outParams.put("timestamp", tenpayParams.getTimestamp());outParams.put("sign", tenpayParams.getSign());outParams.put("orderCode",orderCodeObj.toString());apiResponse = new ApiResponse<Map<String, String>>(RestResultEnum.SUCCESS, 1, outParams);}else{String userId = userIdObj.toString();//根据用户ID获取到该用户的地址UserAddressPo userAddressPo = this.userAddressMapper.queryUserAddressByUserId(Long.valueOf(userId.toString()));HashMap<String,Object> hashMap2 = new HashMap<String, Object>();hashMap2.put("orderCode",orderCodeObj.toString());ShoppingOrderPo shoppingOrderPo =  this.shoppingOrderMapper.selectShoppingOrderByOrderCode(hashMap2);String totalPrice =shoppingOrderPo.getFinalPrice().toString();//最总价格作为实际支付的价格Double fiprice = Double.valueOf(totalPrice)*100;Integer price = (int)Math.round(fiprice);//判断价格不能低于1分钱if(price>=1){totalPrice = price.toString();String body = "";WxpayInfo wxpayInfo = new WxpayInfo();wxpayInfo.setWxpayCode(orderCodeObj.toString());wxpayInfo.setTotalfee(Double.valueOf(totalPrice));wxpayInfo.setPayState(0);//支付未成功--等待微信支付完成的异步通知wxpayInfo.setAttach("");if(!StringUtils.isEmpty(deviceInfoObj)){wxpayInfo.setDeviceinfo(deviceInfoObj.toString());}wxpayInfo.setUserid(Integer.valueOf(userIdObj.toString()));if(!StringUtils.isEmpty(userIpObj)){wxpayInfo.setUserip(userIpObj.toString());}wxpayInfo.setTimestart(new Date());wxpayInfo.setOrderAddress(userAddressPo.getAddress());wxpayInfo.setGoodstag("");wxpayInfo.setBody(body);this.wxpayInfoMapper.insertSelective(wxpayInfo);HttpServletRequest request = apiRequest.getRequest();HttpServletResponse response = apiRequest.getResponse();//获取提交的商品价格String order_price = totalPrice;//获取提交的商品名称String product_name = body;Map<String, String> outParams = new HashMap<String, String>();RequestHandler reqHandler = new RequestHandler(request, response);TenpayHttpClient httpClient = new TenpayHttpClient();//初始化reqHandler.init();reqHandler.init(WxPayConfig.app_id,WxPayConfig.partner, WxPayConfig.partner_key);//=========================//生成预支付单//=========================String noncestr = Sha1Util.getNonceStr();//设置package订单参数SortedMap<String, String> packageParams = new TreeMap<String, String>();packageParams.put("appid", WxPayConfig.app_id);packageParams.put("body",WxPayConfig.body ); //商品描述packageParams.put("mch_id", WxPayConfig.partner); //商户号packageParams.put("nonce_str", noncestr);packageParams.put("notify_url", defaultApiServer+"/wxPay/wxPayNotify"); //接收财付通通知的URLpackageParams.put("out_trade_no", orderCodeObj.toString()); //商家订单号packageParams.put("spbill_create_ip", request.getRemoteAddr()); //订单生成的机器IP,指用户浏览器端IPpackageParams.put("total_fee", order_price); //商品金额,以分为单位packageParams.put("trade_type", "APP"); //商品描述String timestamp = Sha1Util.getTimeStamp();packageParams.put("time_start", timestamp); //字符编码//获取prepayIdString prepayid = reqHandler.sendPrepay(packageParams);if (null != prepayid && !"".equals(prepayid)) {//签名参数列表Map<String,String> map =new HashMap<String, String>();map.put("appid",WxPayConfig.app_id);map.put("noncestr",noncestr);map.put("package","Sign=WXPay");map.put("partnerid",WxPayConfig.partner);map.put("prepayid",prepayid);map.put("timestamp",timestamp);/* 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为prepay_id=wx20141009175351724b348a500087751557*///生成签名System.out.println("**********:"+map.toString());String sign = TenpayUtils.createSign(map);//输出参数outParams.put("retcode", "0");outParams.put("retmsg", "OK");outParams.put("appid", WxPayConfig.app_id);outParams.put("partnerid", WxPayConfig.partner);outParams.put("noncestr", noncestr);outParams.put("package", "Sign=WXPay");outParams.put("prepayid", prepayid);outParams.put("timestamp", timestamp);outParams.put("sign", sign);outParams.put("orderCode",orderCodeObj.toString());} else {outParams.put("retcode", "-2");outParams.put("retmsg", "错误:获取prepayId失败");}this.insertTenpayParams(outParams);response.resetBuffer();response.setHeader("ContentType", "text/json");apiResponse=new ApiResponse<Map<String, String>>(RestResultEnum.SUCCESS,1,outParams);}else{apiResponse=new ApiResponse<Map<String,String>>(RestResultEnum.CheckMoney);}}}catch (Exception ex){ex.printStackTrace();apiResponse=new ApiResponse<Map<String,String>>(RestResultEnum.UNKNOW_ERROR);}return apiResponse;}/*** 再次支付未付款订单的调用方法** @param apiRequest* @return*/@FunctionCode(value = "wxPay.payAgain", descript = "再次支付未付款订单的调用方法")@Overridepublic ApiResponse<TenpayParams> payAgain(ApiRequest apiRequest) {Object orderCodeObj = apiRequest.get("orderCode");if (StringUtils.isEmpty(orderCodeObj)) {return new ApiResponse<TenpayParams>(RestResultEnum.MissParameterException);}ApiResponse<TenpayParams> apiResponse = null;try {TenpayParams tenpayParams = this.tenpayParamsMapper.selectTenPayParamsByorderCode(orderCodeObj.toString());//如果支付成功则调用此接口,并将订单的数据拆解存储对应的数据表apiResponse = new ApiResponse<TenpayParams>(RestResultEnum.SUCCESS, 1, tenpayParams);} catch (Exception ex) {apiResponse = new ApiResponse<TenpayParams>(RestResultEnum.UNKNOW_ERROR);}return apiResponse;}private void insertTenpayParams(Map<String, String> tenpayParams) {TenpayParams tenpayParams1 = new TenpayParams();tenpayParams1.setAppid(tenpayParams.get("appid"));tenpayParams1.setNoncestr(tenpayParams.get("noncestr"));tenpayParams1.setPartnerid(tenpayParams.get("partnerid"));tenpayParams1.setPrepayid(tenpayParams.get("prepayid"));tenpayParams1.setRetcode(tenpayParams.get("retcode"));tenpayParams1.setRetmsg(tenpayParams.get("retmsg"));tenpayParams1.setSign(tenpayParams.get("sign"));tenpayParams1.setTimestamp(tenpayParams.get("timestamp"));tenpayParams1.setWxpayPackage(tenpayParams.get("package"));tenpayParams1.setOrderCode(tenpayParams.get("orderCode"));this.tenpayParamsMapper.insertSelective(tenpayParams1);//新增微信支付认证信息}
}

APP微信支付的后台实现相关推荐

  1. APP 微信支付java后台代码(解决支付失败返回-1)

    开发之前的准备工作: APP支付申请条件 申请成为APP支付商户需要满足以下条件: 1.APP支付商户,须拥有微信开放平台(http://open.weixin.qq.com)的APPID: 2.AP ...

  2. 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服 ...

  3. APP微信支付(java后台_统一下单和回调)

    微信支付Java后台 1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用 ...

  4. IOS --app微信支付

    2019独角兽企业重金招聘Python工程师标准>>> 微信支付分为好几种,这里记录的是app微信支付流程. 适用场景 用户使用xxAPP时,需要通过微信支付完成某项报名.此时xxA ...

  5. 微信h5支付 php sdk_微信支付V3版,H5,APP微信支付PHP服务端使用方式

    使用步骤: 1.导入下载好的微信V3版本SDK public function __construct() { parent::__construct(); //引入微信支付 Vendor('Wxpa ...

  6. app微信支付-java服务端接口 支付/查询/退款

    app微信支付-java服务端接口 支付-查询-退款 个人看微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然 ...

  7. APP微信支付报错《商户号该产品权限未开通,请前往商户平台产品中心检查后重试》

    App微信支付调官方的统一下单接口返回错误信息 {return_msg=商户号该产品权限未开通,请前往商户平台>产品中心检查后重试, return_code=FAIL} 微信开放平台,微信认证申 ...

  8. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...

    Android实现微信支付功能 开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要 ...

  9. Android支付宝错误码62009,hb混合开发app 微信支付提示支付宝62009未知错误

    问题描述 hb混合开发app 微信支付提示支付宝62009未知错误 问题出现的环境背景及自己尝试过哪些方法 真机模拟测试 相关代码 获取通道 mounted(){ plus.payment.getCh ...

最新文章

  1. PC厂商如何演化移动互联网市场格局?
  2. 禁用人脸识别四个月后,旧金山人证明了他们的先见之明
  3. 如何正常使用Safari for Windows
  4. 辗转相除法求最大公约数(c++)
  5. (组合数学笔记)Pólya计数理论_Part.3_置换群及其性质
  6. 由于找不到MSVCP20.dll,无法继续执行代码
  7. Dynamic Entity Representation with Max-pooling Improves Machine
  8. C++11 强类型枚举
  9. 核心网upf作用_【5G核心网】5GC核心网之网元UPF
  10. jtopo实现左键框选,右键拖拽(拓扑图),以及设置成不能拖动
  11. TIM无法打开本地文件
  12. python打字案例,Python 小案例 打字练习
  13. 无锡python程序员_Python程序员学习路线图
  14. 软件测试之-集成测试
  15. div盒模型宽高计算
  16. 如何听广播来学计算机,MAC使用技巧之苹果itunes如何收听国内的广播?
  17. Matlab如何进行利用离散傅里叶逆变换iDFT 从频谱恢复时域信号
  18. [bzoj3123][SDOI2013]森林
  19. 商易通-预约挂号详情页面-预约确认(三十五)
  20. 一位小程序代理商亲自见证小程序在外卖行业的突破

热门文章

  1. 生物信息学算法之Python实现|Rosalind刷题笔记:003 中心法则:翻译
  2. 成本低廉的深度学习与渲染显卡购买方案--英伟达矿卡P106
  3. Gunicorn、Supervisor
  4. 陆道培医疗冲刺香港上市:持续亏损,毛利率下滑,陆佩华为董事长
  5. W ndoWs电脑上的线怎么接,win7一台电脑两个显示器的连接方法介绍
  6. Word 插入图片后不显示或显示不完整怎么办
  7. mysql导入数据出现--unknown command '\'
  8. shiroFilter生命周期
  9. 每次打开Photoshop显示失败恢复文件清理方法
  10. java如何excel导入_java实现Excel导入(迭代一)