微信支付業務思考之業務實現

經過昨天一天的奮戰終於在今天測試並支付成功,開心啊哈哈哈,長話短說,代碼僅是測試的demo,經過測試可以支付成功,代碼優化你們自己來哈

1:引入pom依賴

在mvn中沒有找到,只找到了下面這個版本

<dependency>
    <groupId>com.github.wxpay</groupId>
    <artifactId>wxpay-sdk</artifactId>
    <version>0.0.3</version>
</dependency>

demo中的目錄結構,提供的接口中生成簽名、xml等接口都是現成直接調用即可

2:配置相關參數 (除了官網規定必傳的之外其他的可以在用到的時候慢慢改或者添加)

abc.properties配置

wx_appId=appid

wx_appSecret=  adsfsadfasdfasdfasdf

wx_key=key

mchID=mch_id

certLocalPath= apiclient_cert.p12

certPassword= pwd

 ip=192.168.1.1 

trade_type=JSAPI

3:讀取配置



import java.io.*;
import java.util.*;

/**
 * @Title: WXPayConfig
 * @Description: 微信支付配置項demo
 * @author wdz
 * @date 2019/3/5 9:33
 */
public class WXPayConfig {

    public static  Logger log =  Logger.getLogger(WXPayConfig.class);


    public static  SortedMap<String, String> getWXPayConfig(){
        SortedMap<String, String> map = new TreeMap<>();
        Properties pro = new Properties();
        try {
            InputStream in = WXPayConfig.class.getResourceAsStream("/payInfo.properties");
            pro.load(in);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            log.info("找不到文件:payInfo.properties");
        } catch (IOException e) {
            e.printStackTrace();
            log.info("讀取文件異常。。。。。。");
        }
        map.put("appid",pro.getProperty("wx_appId"));
        map.put("mch_id",pro.getProperty("mchID"));
        map.put("sign_type","MD5");
        map.put("wx_appSecret",pro.getProperty("wx_appSecret"));
        map.put("key",pro.getProperty("wx_key"));
        map.put("certLocalPath",pro.getProperty("certLocalPath"));
        map.put("certPassword",pro.getProperty("certPassword"));
        map.put("spbill_create_ip",pro.getProperty("ip"));
        map.put("trade_type",pro.getProperty("trade_type"));
        map.put("timeStamp",System.currentTimeMillis()+"");
        return map;
    }

}

4:生成32位字符串

public static String getRandomStr(int len) {
    StringBuilder str = new StringBuilder("123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
    StringBuilder sb = new StringBuilder();
    Random r = new Random();
    int range = str.length();
    for (int i = 0; i < len; i++) {
        sb.append(str.charAt(r.nextInt(range)));
    }
    return sb.toString();
}

5:接口繼承



import com.github.wxpay.sdk.WXPayConfig;

import java.io.InputStream;

public  interface IWXPayConfig extends WXPayConfig {

    String getAppID();

    String getMchID();

    String getKey();

    InputStream getCertStream();

    int getHttpConnectTimeoutMs();

    int getHttpReadTimeoutMs();
}

6:接口實現



import com.yunchao.hsh.pay.config.WXPayConfig;
import com.yunchao.hsh.pay.interfaces.IWXPayConfig;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.io.InputStream;
import java.util.SortedMap;

@Service
public class WXPayConfigService implements IWXPayConfig {

    private SortedMap<String, String> map = WXPayConfig.getWXPayConfig();
    @Override
    public String getAppID() {
        return map.get("appid");
    }

    @Override
    public String getMchID() {
        return  map.get("mch_id");
    }

    @Override
    public String getKey() {
        return map.get("key");
    }

    @Override
    public InputStream getCertStream() {
        return new InputStream() {
            @Override
            public int read() throws IOException {
                return 0;
            }
        };
    }

    @Override
    public int getHttpConnectTimeoutMs() {
        return 100000;
    }

    @Override
    public int getHttpReadTimeoutMs() {
        return 100000;
    }


}

7:控制器

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayUtil;
import com.yunchao.hsh.pay.config.WXPayConfig;
import com.yunchao.hsh.pay.interfaces.IWXPayConfig;
import com.yunchao.hsh.pay.utils.WXPayUtils;
import com.yunchao.hsh.utils.superdir.sub.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;
import java.util.SortedMap;

/**
* @Title: WXPayDemoController
* @Description: 微信支付demo
* @author wdz
* @date 2019/3/5 9:31
*/
@Controller
@RequestMapping("/pay")
public class WXPayDemoController {

@Autowired
IWXPayConfig wxPayConfig;

@RequestMapping(value = "/creater",method = RequestMethod.GET)
@ResponseBody
public Result pay(String openid, String notifyUrl, String outTradeNo, String totalFee, String body){
Result result = new Result();
// 用於生成簽名,key必須與微信官網提供的一致,否則不能識別
Map<String, String> sendMap = new HashMap<>();
// 返回給前端
SortedMap<String, String> map = WXPayConfig.getWXPayConfig();
String key = map.get("key");
String mch_id = map.get("mch_id");
String spbill_create_ip = map.get("spbill_create_ip");
String trade_type = map.get("trade_type");
String appid = map.get("appid");
try {
sendMap.put("appid",appid);
sendMap.put("openid",openid);
sendMap.put("mch_id",mch_id);
sendMap.put("nonce_str", WXPayUtils.getRandomStr(32));
sendMap.put("body",body);
sendMap.put("out_trade_no",outTradeNo);
sendMap.put("total_fee",totalFee);
sendMap.put("notify_url",notifyUrl);
sendMap.put("spbill_create_ip",spbill_create_ip);
sendMap.put("trade_type",trade_type);
map.put("appid",appid);
map.put("openid",openid);
map.put("notify_url",notifyUrl);
map.put("out_trade_no",outTradeNo);
map.put("total_fee",totalFee);
map.put("body",body);

// 調用微信工具獲取簽名
String sign = WXPayUtil.generateSignature(sendMap,key);
map.put("sign",sign);
sendMap.put("sign",sign);
// 獲取xml格式數據
String xmlStr = WXPayUtil.generateSignedXml(sendMap, key);
map.put("xml",xmlStr);
  // 調用微信提供的支付,接口繼承及實現就是爲了這一步
WXPay pay = new WXPay(wxPayConfig);
  // 調用統一支付
Map<String, String> resultMap = pay.unifiedOrder(sendMap);
// 判斷是否成功,如果失敗該map中會返回相關信息
if(resultMap.get("return_code").equals("SUCCESS")){
String prepay_id = resultMap.get("prepay_id");
sendMap.put("prepay_id","prepay_id="+prepay_id);
map.put("prepay_id","prepay_id="+prepay_id);
}
} catch (Exception e) {
e.printStackTrace();
}
result.setS("",map);
System.out.println(map.toString());
return result;
}


}

小程序調用支付成功,以上純屬個人理解,還有好多配置沒搞懂,繼續研究,如有錯誤歡迎指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章