Android 가 위 챗 결제 에 접속 하 는 방법
2.APPID 등록(이것 은 프로젝트 의 application 에 넣 을 수 있 습 니 다)
사업 자 APP 프로젝트 에 위 챗 JAR 패 키 지 를 도입 하고 API 를 호출 하기 전에 먼저 위 챗 에 귀하 의 APPID 를 등록 해 야 합 니 다.코드 는 다음 과 같 습 니 다.
final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
// app
msgApi.registerApp("wxd930ea5d5a258f4f");
3.통 일 된 주문 api 를 호출 하여 선불 서 를 생 성하 여 prepay 획득id 후 매개 변 수 를 다시 서명 하여 APP 에 전송 하여 결 제 를 시작 합 니 다.예:
아래 코드 의 주문 번 호 는 배경 에서 생 성 되 어야 합 니 다.
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
WXPrePost post = new WXPrePost();
post.appid = " appId";
post.mch_id = " ";
post.nonce_str = StringUtils.genNonceStr();// **1
post.body = " ";
post.detail = " ";
post.out_trade_no = out_trade_no; // **2
post.total_fee = " ";//
post.spbill_create_ip = getLocalIpAddress();//ip **3
post.notify_url = "";// url
post.trade_type = "APP";
post.sign = genPackageSign(post);// **4
List<NameValuePair> firstSignParams = getFirstSignParams(post);
String xml = toXml(firstSignParams);
String entity = null;
try {
entity = new String(xml.getBytes(), "ISO8859-1");
byte[] buf = Util.httpPost(url, entity);
if (buf != null) {
String content = new String(buf);
Map<String, String> map = decodeXml(content);
if (map != null) {
// ( :Appid partnerId prepayId nonceStr TimeStamp package)
String appId = "";
String prepayId = "";
String nonceStr = "";
for (Map.Entry<String, String> entry : map.entrySet()) {
if ("appid".equals(entry.getKey())) {
appId = entry.getValue();
} else if ("prepay_id".equals(entry.getKey())) {
prepayId = entry.getValue();
} else if ("nonce_str".equals(entry.getKey())) {
nonceStr = entry.getValue();
}
}
Log.d(TAG, "run: :" + appId + "/" + prepayId + "/" + nonceStr + "/");
String TimeStamp = String.valueOf(genTimeStamp());
//ok
String secondPackageSign = genSecondPackageSign(getSecondSignParams(appId, prepayId, nonceStr, TimeStamp));
PayReq req = new PayReq();
req.appId = appId;
req.partnerId = " ";
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp = TimeStamp;
req.packageValue = "Sign=WXPay";
req.sign = secondPackageSign;
req.extData = "app data"; // optional
// System.out.println("genPackageSign3:"+post.getSign()+"/"+secondPackageSign);
// , , IWXMsg.registerApp
mApi.sendReq(req);
Log.d(TAG, "run: " + appId + "/" + prepayId + "/" + nonceStr + "/" + TimeStamp + "/" + secondPackageSign);
}
}
} catch (Exception e) {
}
public static byte[] httpPost(String url, String entity) {
if (url == null || url.length() == 0) {
Log.e(TAG, "httpPost, url is null");
return null;
}
HttpClient httpClient = getNewHttpClient();
HttpPost httpPost = new HttpPost(url);
try {
httpPost.setEntity(new StringEntity(entity));
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json");
HttpResponse resp = httpClient.execute(httpPost);
if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
Log.e(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());
return null;
}
return EntityUtils.toByteArray(resp.getEntity());
} catch (Exception e) {
Log.e(TAG, "httpPost exception, e = " + e.getMessage());
e.printStackTrace();
return null;
}
}
//
public static String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
}
private String toXml(List<NameValuePair> params) {
StringBuilder sb = new StringBuilder();
sb.append("<xml>");
for (int i = 0; i < params.size(); i++) {
sb.append("<" + params.get(i).getName() + ">");
sb.append(params.get(i).getValue());
sb.append("</" + params.get(i).getName() + ">");
}
sb.append("</xml>");
return sb.toString();
}
public Map<String, String> decodeXml(String content) {
try {
Map<String, String> xml = new HashMap<>();
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new StringReader(content));
int event = parser.getEventType();
while (event != XmlPullParser.END_DOCUMENT) {
String nodeName = parser.getName();
switch (event) {
case XmlPullParser.START_DOCUMENT:
break;
case XmlPullParser.START_TAG:
if (!"xml".equals(nodeName)) {
xml.put(nodeName, parser.nextText());
}
break;
case XmlPullParser.END_TAG:
break;
}
event = parser.next();
}
return xml;
} catch (Exception e) {
}
return null;
}
@NonNull
private List<NameValuePair> getFirstSignParams(WXPrePost params) {
List<NameValuePair> packageParams = new LinkedList<>();
packageParams.add(new BasicNameValuePair("appid", "appId"));
packageParams.add(new BasicNameValuePair("body", params.body));
packageParams.add(new BasicNameValuePair("detail", params.detail));
packageParams.add(new BasicNameValuePair("mch_id", " "));
packageParams.add(new BasicNameValuePair("nonce_str", params.nonce_str));
packageParams.add(new BasicNameValuePair("notify_url", params.notify_url));
packageParams.add(new BasicNameValuePair("out_trade_no", params.out_trade_no));
packageParams.add(new BasicNameValuePair("spbill_create_ip", params.spbill_create_ip));
packageParams.add(new BasicNameValuePair("total_fee", params.total_fee + ""));
packageParams.add(new BasicNameValuePair("trade_type", params.trade_type));
packageParams.add(new BasicNameValuePair("sign", params.sign));
return packageParams;
}
public class WXPrePost {
//
public String appid;
// APPID
public String mch_id;
//
public String nonce_str;
// , 32 。
public String sign;
// ,
public String body;
// :APP―― APP - , - 。
public String out_trade_no;
// ,32 、 ,
public int total_fee;
// , ,
public String spbill_create_ip;
// ip
public String notify_url;
// , url url, 。( )
public String trade_type;
//
//
public String device_info;
// ( ID), "WEB"
public String detail;
//
public String attach;
// , API ,
public String fee_type;
// ISO 4217 , :CNY,
//
public String time_start;
// , yyyyMMddHHmmss, 2009 12 25 9 10 10 20091225091010。
//
public String time_expire;
// , yyyyMMddHHmmss, 2009 12 27 9 10 10 20091227091010。 : 5
public String goods_tag;
// , ,
//
public String limit_pay;
//no_credit--
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getMch_id() {
return mch_id;
}
public void setMch_id(String mch_id) {
this.mch_id = mch_id;
}
public String getNonce_str() {
return nonce_str;
}
public void setNonce_str(String nonce_str) {
this.nonce_str = nonce_str;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getOut_trade_no() {
return out_trade_no;
}
public void setOut_trade_no(String out_trade_no) {
this.out_trade_no = out_trade_no;
}
public int getTotal_fee() {
return total_fee;
}
public void setTotal_fee(int total_fee) {
this.total_fee = total_fee;
}
public String getSpbill_create_ip() {
return spbill_create_ip;
}
public void setSpbill_create_ip(String spbill_create_ip) {
this.spbill_create_ip = spbill_create_ip;
}
public String getNotify_url() {
return notify_url;
}
public void setNotify_url(String notify_url) {
this.notify_url = notify_url;
}
public String getTrade_type() {
return trade_type;
}
public void setTrade_type(String trade_type) {
this.trade_type = trade_type;
}
public String getDevice_info() {
return device_info;
}
public void setDevice_info(String device_info) {
this.device_info = device_info;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
public String getAttach() {
return attach;
}
public void setAttach(String attach) {
this.attach = attach;
}
public String getFee_type() {
return fee_type;
}
public void setFee_type(String fee_type) {
this.fee_type = fee_type;
}
public String getTime_start() {
return time_start;
}
public void setTime_start(String time_start) {
this.time_start = time_start;
}
public String getTime_expire() {
return time_expire;
}
public void setTime_expire(String time_expire) {
this.time_expire = time_expire;
}
public String getGoods_tag() {
return goods_tag;
}
public void setGoods_tag(String goods_tag) {
this.goods_tag = goods_tag;
}
public String getLimit_pay() {
return limit_pay;
}
public void setLimit_pay(String limit_pay) {
this.limit_pay = limit_pay;
}
}
여기 서 제 시 된 매개 변 수 는 모두 이동 단 에서 스스로 얻 을 수 있 습 니 다.물론 배경 에서 우리 에 게 제공 하 는 것 이 좋 습 니 다.안전성 을 고려 하여결제 완료,위 챗 은 WXPayEntry Activity 로 되 돌아 갑 니 다.여 기 는 자세히 말 하지 않 겠 습 니 다.위 챗 문 서 는 분명하게 말 합 니 다.
WXPayEntry Activity 의 onResp()에서 되 돌아 온 위 챗 결제 결과(비고:이 결 과 는 우리 가 상품 을 구 매 하 는 성공 여부 의 결과 가 될 수 없 으 며,위 챗 으로 리 턴 한 다음 에 리 턴 하여 우리 에 게 알려 준 지불 결 과 를 기준 으로 합 니 다)
if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
int code = resp.errCode;
switch (code) {
case 0:
Log.d(TAG, "onPayFinish, errCode = " + " ");
// ,
// , , 。
break;
case -1:
Toast.makeText(this, " 1", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onPayFinish, errCode = " + " 1");
finish();
break;
case -2:
Toast.makeText(this, " ", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onPayFinish, errCode = " + " ");
finish();
break;
default:
// Toast.makeText(this, " 2", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onPayFinish, errCode = " + " 2");
setResult(RESULT_OK);
finish();
break;
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.