uniapp打包andorid实现微信支付后端java

无敌的宇宙
无敌的宇宙
擅长邻域:Java,HTML,JavaScript,MySQL,支付,退款,图片上传

分类: Java uni-app 专栏: 支付 java uniapp 标签: uniapp支付 app支付 android支付

2024-12-17 11:14:37 398浏览

准备工作

1申请app应用

https://open.weixin.qq.com/

没有注册,注册完提交企业信息,公共打款等,等待审核,请保证手机号畅通,微信那边会打电话审核,交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展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695