어떻게 안 드 로 이 드 앱 에서 위 챗 결제 에 접속 합 니까?
12216 단어 Androidapp위 챗 페 이 먼 트
위 챗 페 이 먼 트
wechat 공식 접속 문서
앱 내 결제
원본 코드 다운로드
주요 흐름:
1.위 챗 결제 플랫폼 등록 계 정
주:등록 하고 신청 한 후 API 보안 에 API 키 32 자 를 설정 해 야 합 니 다.MD5 암호 화 를 사용 하고 잘 저장 해 야 합 니 다.볼 수 없 으 니까.
2.선불 주문 생 성
3.서명 인자 생 성
4.위 챗 을 올 려 결제 완료
스 캔 페 이 먼 트
스 캔 결 제 는 위 챗 에서 단일 API 를 사용 하고 모드 2 를 사용 합 니 다.모드 1 은 URL 매개 변수 가 잘못 되 었 다 고 말 하고 공식 문서 에 따라 이해 하기 어렵 습 니 다.
일괄 주문 API
일괄 주문 API
위의 기초 위 에서 수정 하 다.
private String getProductArgs() {
// TODO Auto-generated method stub
StringBuffer xml=new StringBuffer();
try {
String nonceStr=getNonceStr();
currentOrderId = getOutTrade();
xml.append("<xml>");
List<NameValuePair> packageParams=new LinkedList<NameValuePair>();
packageParams.add(new BasicNameValuePair("appid", WXConstants.APP_ID));
packageParams.add(new BasicNameValuePair("body", "APP pay test"));
packageParams.add(new BasicNameValuePair("mch_id", WXConstants.MCH_ID));
packageParams.add(new BasicNameValuePair("nonce_str", nonceStr));
// URL ,
packageParams.add(new BasicNameValuePair("notify_url", "http://www.weixunyunduan.com/yunduanwx/wxpay/getpackage"));
// , 32
packageParams.add(new BasicNameValuePair("out_trade_no", getNonceStr()));
// APP ,Native API IP
packageParams.add(new BasicNameValuePair("spbill_create_ip", "192.168.0.1"));
packageParams.add(new BasicNameValuePair("total_fee", "1"));
// Native
packageParams.add(new BasicNameValuePair("trade_type", "NATIVE"));
String sign=getPackageSign(packageParams);
packageParams.add(new BasicNameValuePair("sign", sign));
String xmlString=toXml(packageParams);
return xmlString;
} catch (Exception e) {
// TODO: handle exception
return null;
}
}
private String getOutTrade(){
return UUID.randomUUID().toString().replace("-", "");
}
NATIVE 요청 반환 값 은 다음 과 같 습 니 다.
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[]]></appid>
<mch_id><![CDATA[]]></mch_id>
<nonce_str><![CDATA[]]></nonce_str>
<sign><![CDATA[]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[]]></prepay_id>
<trade_type><![CDATA[NATIVE]]></trade_type>
<code_url><![CDATA[weixin://wxpay/bizpayurl?pr=]></code_url>
</xml>
코드 획득url,그리고 제3자 QR 코드 생 성 라 이브 러 리,예 를 들 어 ZXing 을 사용 하여 QR 코드 를 생 성 합 니 다.ZXingUtils
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PointF;
import android.view.Gravity;
import android.view.View.MeasureSpec;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import java.util.Hashtable;
/**
*
*
*/
public class ZXingUtils {
/**
* ,
*
* @param url
* @param width
* @param height
* @return
*/
public static Bitmap createQRImage(String url, final int width, final int height) {
try {
// URL
if (url == null || "".equals(url) || url.length() < 1) {
return null;
}
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// ,
BitMatrix bitMatrix = new QRCodeWriter().encode(url,
BarcodeFormat.QR_CODE, width, height, hints);
int[] pixels = new int[width * height];
// , ,
// for
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
if (bitMatrix.get(x, y)) {
pixels[y * width + x] = 0xff000000;
} else {
pixels[y * width + x] = 0xffffffff;
}
}
}
// , ARGB_8888
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
} catch (WriterException e) {
e.printStackTrace();
}
return null;
}
/**
*
*
* @param context
* @param contents
*
* @param desiredWidth
*
* @param desiredHeight
*
* @param displayCode
*
* @return
*/
public static Bitmap creatBarcode(Context context, String contents,
int desiredWidth, int desiredHeight, boolean displayCode) {
Bitmap ruseltBitmap = null;
/**
*
*/
int marginW = 20;
/**
*
*/
BarcodeFormat barcodeFormat = BarcodeFormat.CODE_128;
if (displayCode) {
Bitmap barcodeBitmap = encodeAsBitmap(contents, barcodeFormat,
desiredWidth, desiredHeight);
Bitmap codeBitmap = creatCodeBitmap(contents, desiredWidth + 2
* marginW, desiredHeight, context);
ruseltBitmap = mixtureBitmap(barcodeBitmap, codeBitmap, new PointF(
0, desiredHeight));
} else {
ruseltBitmap = encodeAsBitmap(contents, barcodeFormat,
desiredWidth, desiredHeight);
}
return ruseltBitmap;
}
/**
* Bitmap
*
* @param contents
*
* @param format
*
* @param desiredWidth
* @param desiredHeight
* @return
* @throws WriterException
*/
protected static Bitmap encodeAsBitmap(String contents,
BarcodeFormat format, int desiredWidth, int desiredHeight) {
final int WHITE = 0xFFFFFFFF;
final int BLACK = 0xFF000000;
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix result = null;
try {
result = writer.encode(contents, format, desiredWidth,
desiredHeight, null);
} catch (WriterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int width = result.getWidth();
int height = result.getHeight();
int[] pixels = new int[width * height];
// All are 0, or black, by default
for (int y = 0; y < height; y++) {
int offset = y * width;
for (int x = 0; x < width; x++) {
pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
}
}
Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;
}
/**
* Bitmap
*
* @param contents
* @param width
* @param height
* @param context
* @return
*/
protected static Bitmap creatCodeBitmap(String contents, int width,
int height, Context context) {
TextView tv = new TextView(context);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(layoutParams);
tv.setText(contents);
tv.setHeight(height);
tv.setGravity(Gravity.CENTER_HORIZONTAL);
tv.setWidth(width);
tv.setDrawingCacheEnabled(true);
tv.setTextColor(Color.BLACK);
tv.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
tv.buildDrawingCache();
Bitmap bitmapCode = tv.getDrawingCache();
return bitmapCode;
}
/**
* Bitmap
*
* @param first
* @param second
* @param fromPoint
* Bitmap ( Bitmap)
* @return
*/
protected static Bitmap mixtureBitmap(Bitmap first, Bitmap second,
PointF fromPoint) {
if (first == null || second == null || fromPoint == null) {
return null;
}
int marginW = 20;
Bitmap newBitmap = Bitmap.createBitmap(
first.getWidth() + second.getWidth() + marginW,
first.getHeight() + second.getHeight(), Config.ARGB_4444);
Canvas cv = new Canvas(newBitmap);
cv.drawBitmap(first, marginW, 0, null);
cv.drawBitmap(second, fromPoint.x, fromPoint.y, null);
cv.save(Canvas.ALL_SAVE_FLAG);
cv.restore();
return newBitmap;
}
}
Bitmap bitmap = ZXingUtils.createQRImage(wxUrl,200,200);
code_url 은 위 챗 에서 식별 할 수 있 는 짧 은 체인 입 니 다.사용자 가 스 캔 하면 휴대 전화 에서 지불 할 수 있다.
주문 조회 API
결제 리 셋 가 져 오기,주문 조회 API 사용
주문 조회 API
String urlString="https://api.mch.weixin.qq.com/pay/orderquery";
CheckAsyncTask checkAsyncTask = new CheckAsyncTask();
checkAsyncTask.execute(urlString);
private class CheckAsyncTask extends AsyncTask<String,Void, Map<String, String>>
{
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
dialog = ProgressDialog.show(PayActivity.this, " ", " !");
}
@Override
protected Map<String, String> doInBackground(String... params) {
// TODO Auto-generated method stub
String url=String.format(params[0]);
String entity=getProductCheckArgs();
byte[] buf= wxUtils.httpPost(url, entity);
String content = new String(buf);
Map<String,String> xml=decodeXml(content);
// xml.get("trade_state");
return xml;
}
@Override
protected void onPostExecute(Map<String, String> result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
if (dialog != null) {
dialog.dismiss();
}
}
}
이상 은 어떻게 안 드 로 이 드 앱 에서 위 챗 결 제 를 접속 하 는 지 에 대한 상세 한 내용 입 니 다.안 드 로 이 드 앱 에서 위 챗 결 제 를 접속 하 는 것 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.