微信支付wxpay -- 移动端app第一章节 -- 注意点
配置文件中
1.app_id :是移动端相关的appId,在微信支付平台中-->产品中心-->APPID授权管理-->里面的列表中APPID,即时这个
2.BUSINESS_CODE : 商户号--即在代码中获取的 MchID ,支付平台(pay.weixin.qq.com....)-->产品中心--> 开发配置 -->商户信息(在开发配置中,还可以配置公众号支付的jsapi支付的目录,和扫码支付的回调连接)
3.API_KEY :在微信支付平台中-->账户中心-->api安全--api秘钥设置(在API调用时用来按照指定规则对你的请求参数进行签名,服务器收到你的请求时会进行签名验证,既可以界定你的身份也可以防止其他人恶意篡改请求数据。)
4.APIV3_KEY:在微信支付平台中-->账户中心--> apiv3秘钥,(调用APIv3的下载平台证书接口、处理回调通知中报文时,要通过该密钥来解密信息,防止报文被他人恶意篡改)
5.SIGN_TYPE:签名类型,默认MD5,一般默认即可
6.PEM_ADDRESS:证书地址,类似(/wxConfig/apiclient_cert.p12)
7.NOTIFY_URL:异步通知地址,比如(http://test-xxx.com/wxAppPay/notify),不可带参数
8.重点:微信支付的签名,一共生成2次,第一次是在生成预支付订单的时候,参数如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //生成商户订单号,不可重复 String out_trade_no = "wxpay" + System.currentTimeMillis(); data.put( "appid" , config.getAppID()); //应用ID data.put( "mch_id" , config.getMchID()); //商户号 data.put( "nonce_str" , WXPayUtil.generateNonceStr()); //随机字符串,不长于32位。推荐随机数生成算法 String body = "新脸谱微信订单支付-测试-" + System.currentTimeMillis(); data.put( "body" , body); //商品描述 data.put( "out_trade_no" , out_trade_no); //商户订单号 data.put( "total_fee" , total_fee); //总金额 data.put( "spbill_create_ip" , spbillCreateIp); //自己的服务器IP地址 ---点击支付的机器IP data.put( "notify_url" , NOTIFY_URL); //异步通知地址(请注意必须是外网) data.put( "trade_type" , TRADE_TYPE_APP); //交易类型 data.put( "attach" , attach); //附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据 String sign1 = WxMD5Util.getSign(data);------------------------------------------------------------------------在该处生成签名 data.put( "sign" , sign1); //签名 |
第二次是在返回给移动端之前,参加生成签名字段有且只能是6个,分别为appid、partnerid、prepayid、package、noncestr和timestamp,而且都必须是小写,可能移动端app需要的带驼峰,但是参加支付的签名一不是驼峰的那些,如下代码
1 2 3 4 5 6 7 8 9 10 11 | map = new HashMap<>(); //返回APP端的数据 //参加调起支付的签名字段有且只能是6个,分别为 appid、partnerid、prepayid、package、noncestr 和 timestamp,而且都必须是小写---------start--------------------- map.put( "appid" , result.get( "appid" )); map.put( "partnerid" , result.get( "mch_id" )); map.put( "prepayid" , result.get( "prepay_id" )); map.put( "package" , "Sign=WXPay" ); map.put( "noncestr" , result.get( "nonce_str" )); String signTimstamp = String.valueOf(System.currentTimeMillis() / 1000 ); map.put( "timestamp" , signTimstamp); //单位为秒 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步