博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
支付模块-第三方APP如何拉取微信小程序支付(编码篇)
阅读量:353 次
发布时间:2019-03-04

本文共 6234 字,大约阅读时间需要 20 分钟。

【前言】

            今天终于测试了一下获取到了miniPayReRuest,那我就分享一下了。

【实现过程】

    (1)获取参数     

static String wxXcxUrl = "https://api-mop.chinaums.com/v1/netpay/wx/unified-order";

 因为我这个接口是小程序调取的,获取的参数第一个是从小程序获取的code值,第二个参数是服务传给小程序,然后小程序再传给服务的orderId。

/**     * app下单方法-微信小程序     *     * @param wxXcxPayInfo     * @return     * @throws Exception     */    @ApiOperation(value = "App下单-微信小程序", notes = "App下单-微信小程序")    @PostMapping("/wxXcxPay")    public String placeAnOrderWxXcxPay(WxXcxPayInfo wxXcxPayInfo) throws Exception {        String code = wxXcxPayInfo.getCode();        String orderId = wxXcxPayInfo.getOrderId();        //1、首先,我们要根据code值获取到OpenId       String openId =wxXcxService.getOpenId(code);              //2、根据订单号获取商品的金额,然后传给银联的接口,返回获取MiniPayRequest,再将openId和参数一起返回。//        Order orderSellCount = orderService.getSellCountByOrderId(Long.valueOf(orderId));//        String payNum = orderSellCount.getPayNum();          Long payNumIs =1L;//        Long payNumIs = Long.valueOf(payNum);        AppXiaDanDTO appXiaDanDTO = new AppXiaDanDTO();        //获取支付的金额//        appXiaDanDTO.setPlatformAmount(BigDecimal.valueOf(payNumIs));        appXiaDanDTO.setTotalAmount(BigDecimal.valueOf(1));        //报文请求时间        appXiaDanDTO.setRequestTimestamp(DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));        //商户订单号//        appXiaDanDTO.setMerOrderId(orderId);        appXiaDanDTO.setMerOrderId(Util.getMerOrderId(msgSrcId));        //商户号        appXiaDanDTO.setMid(mid);        //终端号        appXiaDanDTO.setTid(tid);        //微信子商户appId//        appXiaDanDTO.setSubAppId("");        appXiaDanDTO.setSubAppId("");        //用户子标识-微信必传//        appXiaDanDTO.setSubOpenId("");        appXiaDanDTO.setSubOpenId(openId);        //交易类型        appXiaDanDTO.setTradeType("MINI");        //业务类型        appXiaDanDTO.setInstMid("MINIDEFAULT");        appXiaDanDTO.setPlatformAmount(BigDecimal.valueOf(1));        String appXiaDanDTOJson = JSONObject.toJSONString(appXiaDanDTO);        String send = appXiaDanService.send(wxXcxUrl, appXiaDanDTOJson);        return send;    }

这个code的目的就是为了获取OpenId,orderId看你们自己项目的需求即可。

(2)获取OpenId

@Service@Slf4jpublic class WxXcxServiceImpl implements WxXcxService {    @Override    public String getOpenId(String code) throws  Exception {        //通过code值获取到OpenId        Map
rtnMap = new HashMap
(); String url = "https://api.weixin.qq.com/sns/jscode2session"; url+="?appid="; url+="&secret="; url+="&js_code="+code; url+="&grant_type=authorization_code"; String res = null; CloseableHttpClient httpClient = HttpClientBuilder.create().build(); //Get方式 HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = null; //配置信息 RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(5000) .setConnectionRequestTimeout(5000) .setSocketTimeout(5000) .setRedirectsEnabled(false).build(); httpGet.setConfig(requestConfig); response = httpClient.execute(httpGet); //从响应模型中获取响应实体 HttpEntity responseEntity = response.getEntity(); System.out.println("响应状态为"+response.getStatusLine()); if (responseEntity !=null){ res = EntityUtils.toString(responseEntity); System.out.println("响应内容长度为"+responseEntity.getContentLength()); System.out.println("响应内容为"+res); } //释放资源 if (httpClient!=null){ httpClient.close(); } if (response!=null){ response.close(); } JSONObject jo = JSON.parseObject(res); String openid = jo.getString("openid"); System.out.println("openid"+openid); return openid;// return null; }}

(3) 银联的鉴权

@Slf4j@Service@AllArgsConstructorpublic class AppXiaDanServiceImpl implements AppXiaDanService {    static String appId = "";    static String appKey ="";    static String authorization;    @Override    public String send(String url, String entity) throws Exception {        authorization = getOpenBodySig(appId,appKey,entity);        CloseableHttpClient httpClient = HttpClients.createDefault();        HttpPost httpPost = new HttpPost(url);        httpPost.addHeader("Authorization",authorization);        StringEntity se = new StringEntity(entity,"UTF-8");        se.setContentType("application/json");        httpPost.setEntity(se);        CloseableHttpResponse response = httpClient.execute(httpPost);        HttpEntity entity1 = response.getEntity();        String resStr = null;        if (entity1!=null){            resStr = EntityUtils.toString(entity1,"UTF-8");        }        httpClient.close();        response.close();        return resStr;    }    public static String getOpenBodySig(String appId,String appKey,String body) throws Exception{        String timestamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());        String nonce = UUID.randomUUID().toString().replace("-", "");        byte[] data = body.getBytes("UTF-8");        InputStream is  = new ByteArrayInputStream(data);        String bodyDigest = testSHA256(is);        String st1_C=appId+timestamp+nonce+bodyDigest;        byte[] localSignature = hmacSHA256(st1_C.getBytes(), appKey.getBytes());        String localSignatureStr =Base64.encodeBase64String(localSignature); //Signature        return  ("OPEN-BODY-SIG AppId=" + "\"" + appId + "\"" + ", Timestamp=" + "\"" + timestamp + "\"" + ", Nonce=" + "\"" + nonce + "\"" + ", Signature=" + "\"" + localSignatureStr + "\"");    }    private static byte[] hmacSHA256(byte[] data, byte[] key) throws NoSuchAlgorithmException, InvalidKeyException {        String algorithm = "HmacSHA256";        Mac mac = Mac.getInstance(algorithm);        mac.init(new SecretKeySpec(key,algorithm));        return mac.doFinal(data);    }    /**     * 进行加密     * @param is     * @return 加密后的结果     */    private static String testSHA256(InputStream is) {        try {            return DigestUtil.sha256Hex(is);        } catch (Exception e) {            e.printStackTrace();        }        return null;    }}

【测试返回】

在这时候测试之前还需要营业执照和身份证和微信实名认证

测试结果: 

转载地址:http://hphe.baihongyu.com/

你可能感兴趣的文章