微信二维码API支付实现demo

目录

1.前置条件

1.1官方文档

1.2申请微信商户号

1.2.1申请步骤

2.后端API实现

3.前端实现


1.前置条件

1.1官方文档

新版微信:支付开发者文档

旧版文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

ps:旧版的SDK文档官网不再支持,本文demo基于旧版本的实现

下面账号实在官网申请的

1.2申请微信商户号

商户号的申请需要填写相关材料,签署电子协议等,申请后需要准备4个代码串。

appid、mch_id、partnerkey、sign

1.2.1申请步骤

2.后端API实现

微信支付-开发者文档

 HttpClient

引入依赖

            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.1</version>
            </dependency>
//新版https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml
//辅助微信接口调用的辅助函数
            <dependency>
                <groupId>com.github.wxpay</groupId>
                <artifactId>wxpay-sdk</artifactId>
                <version>0.0.3</version>
            </dependency>

此版本api为老版本主要使用3个函数

//获取随机字符串
WXPayUtil.generateNonceStr()
//MAP转换为XML字符串(自动添加签名)
WXPayUtil.generateSignedXml(param, partnerkey)
//xml转换成MAP
WXPayUtil.xmlToMap(result)

代码

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.*;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.ssl.SSLContexts;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.ParseException;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

/**
 * http请求客户端
 *
 *
 */
public class HttpClient {

    private String url;
    private Map<String, String> param;
    private int statusCode;
    private String content;
    private String xmlParam;
    private boolean isHttps;
    private boolean isCert = false;
    //证书密码 微信商户号(mch_id)
    private String certPassword;

    public boolean isHttps() {
        return isHttps;
    }

    public void setHttps(boolean isHttps) {
        this.isHttps = isHttps;
    }

    public boolean isCert() {
        return isCert;
    }

    public void setCert(boolean cert) {
        isCert = cert;
    }

    public String getXmlParam() {
        return xmlParam;
    }

    public void setXmlParam(String xmlParam) {
        this.xmlParam = xmlParam;
    }

    public HttpClient(String url, Map<String, String> param) {
        this.url = url;
        this.param = param;
    }

    public HttpClient(String url) {
        this.url = url;
    }

    public String getCertPassword() {
        return certPassword;
    }

    public void setCertPassword(String certPassword) {
        this.certPassword = certPassword;
    }

    public void setParameter(Map<String, String> map) {
        param = map;
    }

    public void addParameter(String key, String value) {
        if (param == null)
            param = new HashMap<String, String>();
        param.put(key, value);
    }

    public void post() throws ClientProtocolException, IOException {
        HttpPost http = new HttpPost(url);
        setEntity(http);
        execute(http);
    }

    public void put() throws ClientProtocolException, IOException {
        HttpPut http = new HttpPut(url);
        setEntity(http);
        execute(http);
    }

    public void get() throws ClientProtocolException, IOException {
        if (param != null) {
            StringBuilder url = new StringBuilder(this.url);
            boolean isFirst = true;
            for (String key : param.keySet()) {
                if (isFirst)
                    url.append("?");
                else
                    url.append("&");
                url.append(key).append("=").append(param.get(key));
            }
            this.url = url.toString();
        }
        HttpGet http = new HttpGet(url);
        execute(http);
    }

    /**
     * set http post,put param
     */
    private void setEntity(HttpEntityEnclosingRequestBase http) {
        if (param != null) {
            List<NameValuePair> nvps = new LinkedList<NameValuePair>();
            for (String key : param.keySet())
                nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数
            http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数
        }
        if (xmlParam != null) {
            http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
        }
    }
    private void execute(HttpUriRequest http) throws ClientProtocolException,
            IOException {
        CloseableHttpClient httpClient = null;
        try {
            if (isHttps) {
                if(isCert) {
                    //TODO 需要完善
                    FileInputStream inputStream = new FileInputStream(new File(ConstantPropertiesUtils.CERT));
                    KeyStore keystore = KeyStore.getInstance("PKCS12");
                    char[] partnerId2charArray = certPassword.toCharArray();
                    keystore.load(inputStream, partnerId2charArray);
                    SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(keystore, partnerId2charArray).build();
                    SSLConnectionSocketFactory sslsf =
                            new SSLConnectionSocketFactory(sslContext,
                                    new String[] { "TLSv1" },
                                    null,
                                    SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
                    httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
                } else {
                    SSLContext sslContext = new SSLContextBuilder()
                            .loadTrustMaterial(null, new TrustStrategy() {
                                // 信任所有
                                public boolean isTrusted(X509Certificate[] chain,
                                                         String authType)
                                        throws CertificateException {
                                    return true;
                                }
                            }).build();
                    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                            sslContext);
                    httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
                            .build();
                }
            } else {
                httpClient = HttpClients.createDefault();
            }
            CloseableHttpResponse response = httpClient.execute(http);
            try {
                if (response != null) {
                    if (response.getStatusLine() != null)
                        statusCode = response.getStatusLine().getStatusCode();
                    HttpEntity entity = response.getEntity();
                    // 响应内容
                    content = EntityUtils.toString(entity, Consts.UTF_8);
                }
            } finally {
                response.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            httpClient.close();
        }
    }
    public int getStatusCode() {
        return statusCode;
    }
    public String getContent() throws ParseException, IOException {
        return content;
    }
}

有了发送请求的方式后就需要拼接参数向官网提供的网址发送请求,在发送请求后返回二维码的字符串,在通过前端的解析获取字符串

    @Override
    public Map createNative(Long orderId)  {
        try {
//        1.根据orderid查询订单信息
            OrderInfo orderInfo = orderService.getById(orderId);
//        2.根据订单信息,交易类型创建交易记录
            paymentService.savePaymentInfo(orderInfo, PaymentTypeEnum.WEIXIN.getStatus());
//        3.封装调用微信接口参数
            HashMap<String, String> paramMap = new HashMap<>();
            paramMap.put("appid", ConstantPropertiesUtils.APPID);
            paramMap.put("mch_id", ConstantPropertiesUtils.PARTNER);
            paramMap.put("nonce_str", WXPayUtil.generateNonceStr());
            String body = orderInfo.getReserveDate() + "就诊" + orderInfo.getDepname();
            paramMap.put("body", body);
            paramMap.put("out_trade_no", orderInfo.getOutTradeNo());
            paramMap.put("total_fee", "1"); //设置交易金额
            paramMap.put("spbill_create_ip", "127.0.0.1");
            paramMap.put("notify_url", "http://guli.shop/api/order/weixinPay/weixinNotify");
            paramMap.put("trade_type", "NATIVE");
//        4.创建客户都安兑现是(url)
            HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/pay/unifiedorder");
//        5.向客户都安对象存入参数(map=>xml)
            client.setXmlParam(WXPayUtil.generateSignedXml(paramMap, ConstantPropertiesUtils.PARTNERKEY));
            client.setHttps(true);
//        6.客户都安对象发送请求
            client.post();
//        7.获取相应(xml),转换类型(xml=>map)
            String xml = client.getContent();
            System.out.println("xml=" + xml);
            Map<String, String> resultMap = WXPayUtil.xmlToMap(xml);
//        8.封装返回
            HashMap<String, Object> map = new HashMap<>();
            map.put("orderId", orderId);
            map.put("totalFee", orderInfo.getAmount());
            map.put("resultCode", resultMap.get("result_code"));
            map.put("codeUrl", resultMap.get("code_url"));
            return map;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

3.前端实现

前端的实现需要单独使用一个工具vue-qriously该插件专门用于对微信的code进行二维码展示

安装:npm install vue-qriously

需要在main.js或者插件中启动工具

import Vue from 'vue'
import VueQriously from 'vue-qriously'
Vue.use(VueQriously)

页面实现

在主vue中绑定value值,就可以显示结果

<qriously :value="payObj.codeUrl" :size="220"></qriously>

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCvSharp微信二维码引擎Demo是一个基于OpenCvSharp库开发的针对微信二维码识别的示例程序。微信二维码引擎是指能够识别微信扫一扫功能中的二维码的引擎。下面我将对这个Demo进行简要介绍。 首先,这个Demo使用了OpenCvSharp库,该库是OpenCV的C#封装,能够方便地在C#中使用OpenCV的功能。由于微信二维码引擎是基于图像识别的,OpenCV提供了强大的图像处理和计算机视觉功能,因此选择OpenCvSharp作为开发工具十分合适。 这个Demo主要实现微信二维码的识别功能。在使用之前,首先需要安装OpenCvSharp库,并完成相关的配置。然后,我们可以通过该Demo微信二维码图片加载进来,使用OpenCvSharp库提供的图像处理方法进行处理和分析。 在识别过程中,Demo会利用OpenCvSharp库中的二维码识别算法来检测和解码图像中的二维码。通过对二维码的解码,我们可以获取到其中存储的信息,比如链接、文本等。 最后,Demo会将识别出的二维码信息以文本的形式输出,方便用户查看和使用。此外,我们还可以根据需要进行二维码的进一步处理,比如裁剪、旋转等。 总之,OpenCvSharp微信二维码引擎Demo是一个基于OpenCvSharp库开发的示例程序,能够实现微信二维码的识别功能。通过使用这个Demo,我们可以了解和学习如何使用OpenCvSharp库进行微信二维码的识别,从而为后续的二维码应用开发提供了基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值