uniapp打包andorid实现微信支付后端java
分类: Java uni-app 专栏: 支付 java uniapp 标签: uniapp支付 app支付 android支付
2024-12-17 11:14:37 398浏览
1申请app应用
没有注册,注册完提交企业信息,公共打款等,等待审核,请保证手机号畅通,微信那边会打电话审核,交300认证费,按提示搞
2填写app信息,截图,logo简介等待审核
3开通商户,会让你写appid,所以需要等2开通审核通过
4进入app,点击能力,开通支付,需要商户开通后才可以弄,基本就是根据提示搞
让就是支付代码,uniapp不用说了很简单,就那几行代码,主要是支付接口
我用的v2的支付,参数那好后,支付类型写成APP,需要二次签名才可以用,就这个二次签名不清楚的,花了不少时间。
public Map<String,Object> getWXQr(String body, String out_trade_no, Double total_fee, String notify_url,String ptype,String openid) throws Exception {
Map<String,Object> rm=new HashMap<>();
GFWXPay config = new GFWXPay();
WXPay wxpay = new WXPay(config);
Map<String, String> data = new HashMap<String, String>();
// 根据微信支付api来设置
data.put("appid", config.getAppID());
data.put("mch_id", config.getMchID()); // 商户号
// 扫码支付
String nonce_str = WXPayUtil.generateNonceStr();
data.put("nonce_str", nonce_str); // 随机字符串小于32位
if(body.length()>10)body=body.substring(0,10)+"...";
data.put("body", Sys.Common.pronameHZ+ "-" + body);
data.put("out_trade_no", out_trade_no);
String cts= DateUtils.getNowDateTsString();
data.put("time_expire", DateUtils.afterDateTs2( cts,2) );
data.put("fee_type", "CNY"); // 默认人民币
data.put("total_fee", ((int) (total_fee * 1000/10)) + ""); // 订单总金额
data.put("spbill_create_ip", "101.35.191.213"); // 终端ip
data.put("notify_url", notify_url); // 回调地址
data.put("sign_type", "MD5");
data.put("trade_type", "APP"); // 支付场景 APP
String sign = WXPayUtil.generateSignature(data, config.getKey()); // 签名
data.put("sign", sign);
/** wxPay.unifiedOrder 这个方法中调用微信统一下单接口 */
Map<String, String> respData = wxpay.unifiedOrder(data);
System.out.println("**************wx "+ptype+" pay***********************************");
System.out.println(respData);
if(respData.get("result_code").equals("SUCCESS") &&respData.get("return_code").equals("SUCCESS") && respData.get("return_msg").equals("OK")) {
rm.put("status","1");
// 需要二次签名
// appid,partnerid,prepayid,noncestr,timestamp,package *严格按照这个格式,不使用驼峰法命名,不使用下划线(这个地方特别坑,两次签名中相同的字段居然用的不同的字段名,官方也不提示,连格式也不强调,真的是坑啊)
// 其中:partnerid为商户号,prepayid为预付订单号,timestamp为10位时间戳(strval($time)),package的值格式为Sign=WXPay(微信官方说是写死的)
// appid,partnerid,prepayid,noncestr,timestamp,package
Map<String, String> payMap = new HashMap<String, String>();
payMap.put("appid", config.getAppID());
payMap.put("partnerid", config.getMchID());
payMap.put("prepayid", respData.get("prepay_id"));
payMap.put("noncestr", WXPayUtil.generateNonceStr());
payMap.put("timestamp", WXPayUtil.getCurrentTimestamp()+"");
payMap.put("package", "Sign=WXPay");
String paySign = WXPayUtil.generateSignature(payMap, config.getKey());
payMap.put("sign", paySign);
rm.put("obj",payMap);
return rm;
} else
rm.put("status","0");
return rm;
}
回调 验证
package com.jff.driving.pay.wxpay.notify;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.github.wxpay.sdk.WXPayConstants;
import com.jff.driving.bean.JfUsers;
import com.jff.driving.bean.SysPayLog;
import com.jff.driving.bean.VipBuyRecord;
import com.jff.driving.pay.wxpay.WXPayUtil;
import com.jff.driving.service.JfUsersService;
import com.jff.driving.service.SysPayLogService;
import com.jff.driving.service.VipBuyRecordService;
import com.jff.driving.util.DateUtils;
import com.jff.driving.util.Sys;
import org.springframework.beans.factory.annotation.Autowired;
@WebServlet("/xxx.do")
public class xxxServlet extends HttpServlet{
@Autowired
private SysPayLogService sysPayLogService;
@Autowired
private VipBuyRecordService vipBuyRecordService;
@Autowired
private JfUsersService usersService;
/**
* @see HttpServlet#HttpServlet()
*/
public WxpayNotifyServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
response.setHeader( "Content-type", "text/html;charset=UTF-8" );
InputStream in = request.getInputStream();
BufferedReader br = new BufferedReader( new InputStreamReader( in, "UTF-8" ) );
StringBuffer result = new StringBuffer();
String line = "";
while ( ( line = br.readLine() ) != null )
{
result.append(line);
}
try {
//签名验证
Boolean signboo= isSignatureValid(result.toString(), Sys.wxapp_pay.key);
System.out.println("===微信,购买Vip,回调========签名验证=============================sign="+signboo);
Map<String, String> map = WXPayUtil.xmlToMap( result.toString() );
System.out.println("===微信,购买Vip,回调=====================================");
String mch_id=map.get("mch_id");
String appid=map.get("appid");
if(map.get("result_code").equals("SUCCESS")&&map.get("return_code").equals("SUCCESS")&&map.get("return_code").equals("SUCCESS")&&signboo) {
}else{
}
} catch (Exception e) {
e.printStackTrace();
}finally{
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
/**
* 判断签名是否正确
*
* @param xmlStr XML格式数据
* @param key API密钥
* @return 签名是否正确
* @throws Exception
*/
public static boolean isSignatureValid(String xmlStr, String key) throws Exception {
Map<String, String> data = WXPayUtil.xmlToMap(xmlStr);
if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {
return false;
}
String sign = data.get(WXPayConstants.FIELD_SIGN);
return WXPayUtil.generateSignature(data, key).equals(sign);
}
}
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论

java
vue
springboot
Mysql
ssm
小程序
uniapp
js和jquery